一、使用SimpleMappingExceptionResolver解析器

1.1在mvc中进行 配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--spring mvc的配置文件-->
<!--开启mvc的注解-->
<mvc:annotation-driven conversion-service="conversionService" >
<!--配置转换器 转换日期的格式。-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven> <!--配置日期转换器-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.aaa.controller.DateConverter"/>
</set>
</property>
</bean> <mvc:default-servlet-handler/>
<!--扫描器:扫描控制器的注解-->
<context:component-scan base-package="com.aaa.controller"/> <!--4.静态资源注解-->
<mvc:default-servlet-handler/>
<!--<mvc:resource mapping="/static/**" location="/static/"/>--> <!--3.视图解析器:进行视图解析
prefix+ 视图名字+suffix
-->
<!--5.文件上传的解析器 可以设置相关的属性。-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<!--文件上传的大小:单位:字节-->
<property name="maxUploadSize" value="#{10*1024*1024}"/>
</bean> <!-- 异常处理 1. 配置解析器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--1.1默认的错误视图 发生异常时, 跳转到的页面-->
<property name="defaultErrorView" value="error"/>
<!--1.2 异常的属性 捕获到的错误信息。-->
<property name="exceptionAttribute" value="ex"/> <!--1.3exceptionMappings -->
<property name="exceptionMappings">
<props>
<prop key="异常类型1">
error1
</prop>
<prop key="异常类型2">
error2
</prop>
</props>
</property>
</bean> <!--6. 配置一个拦截器 -->
<mvc:interceptors>
<!--<mvc:interceptor>-->
<!--&lt;!&ndash; 拦截的路径 &ndash;&gt;-->
<!--<mvc:mapping path="/**"/>-->
<!--&lt;!&ndash; 配置拦截器的bean &ndash;&gt;-->
<!--&lt;!&ndash; 放行路径 &ndash;&gt;-->
<!--<mvc:exclude-mapping path="/user/login"/>-->
<!--<bean class="com.aaa.interceptors.MyIntercept"/>-->
<!--</mvc:interceptor>-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.aaa.interceptors.Demo02"/>
</mvc:interceptor> </mvc:interceptors> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/"/> <!--视图前缀-->
<property name="suffix" value=".jsp"/> <!--视图后缀-->
</bean> <aop:config ></aop:config> </beans>

1.2、建立一个jsp页面,来接收错误的信息。注意路径 ,我的放在 webapp 下。

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/8/14
Time: 14:57
To change this template use File | Settings | File Templates.
--%>
<%--isErrorPage 是否设置错误的页面 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<h1>本页面,接收异常数据:${ex}</h1> </body>
</html>

1.3  后台控制层

package com.aaa.controller;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
// if (!currentUser.isAuthenticated()) {
// //用户名密码令牌
// UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// //记住我
// token.setRememberMe(true);
// try {
// //调用Suject.login方法 ---》安全管理器--->认证器 ,授权器
// currentUser.login(token);
// } catch (UnknownAccountException uae) {//账号不存在
// log.info("There is no user with username of " + token.getPrincipal());
// } catch (IncorrectCredentialsException ice) {//密码错误
// log.info("Password for account " + token.getPrincipal() + " was incorrect!");
// throw new IncorrectCredentialsException("密码错误");
// } catch (LockedAccountException lae) {//账号锁死
// log.info("The account for username " + token.getPrincipal() + " is locked. " +
// "Please contact your administrator to unlock it.");
// }
// // ... catch more exceptions here (maybe custom ones specific to your application?
// catch (AuthenticationException ae) {
// //unexpected condition? error?
// }
// }
@Controller
@RequestMapping("/user")
public class UserController { //获取日志对象
private static final transient Logger log= LoggerFactory.getLogger(UserController.class); @RequestMapping("/login")
public String login(String username,String password, HttpSession session){ //获得封装的对象
Subject currentUser= SecurityUtils.getSubject(); //获得的令牌中的信息
UsernamePasswordToken token = new UsernamePasswordToken(username, password); //记住我
token.setRememberMe(true); currentUser.login(token); //密码正确 就让它 跳转到指定的页面
return "view/ok";
} }

二、使用@ExceptionHandler  注解,     只能控制当前 控制器的异常。  可以自定义异常的处理方法。

2.1 控制层 BaseController中自定义  异常处理方式

package com.aaa.controller;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder; import javax.sound.midi.Soundbank;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
*1.实体类中添加注解。
*
* 2.创建BaseController
*
* 3.定义全局的类型转换器
* */
public class BaseController { @InitBinder
public void init(WebDataBinder binder){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//严格转换 不会自动进行日期的增减处理
simpleDateFormat.setLenient(false); //注册一个类型转换器
binder.registerCustomEditor(Date.class,new CustomDateEditor(simpleDateFormat,true));
} //自定的方法。 只能控制当前 控制器的异常
@ExceptionHandler(RuntimeException.class)
public String handler(RuntimeException ex, Model model){ //将异常放在model里面 捕获信息
model.addAttribute("ex",ex); //模拟根据异常不同的情况 返回不同的视图
if (ex instanceof AuthenticationException){
System.out.println("处理方案一");
model.addAttribute("ex",ex);
return "error";
}else if (ex instanceof AuthorizationException){
System.out.println("处理方案二");
model.addAttribute("ex",ex);
return "error";
} //根据不同的异常情况可以,返回不同的界面。
return "error";
}
}

2.2  UserController

package com.aaa.controller;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
// if (!currentUser.isAuthenticated()) {
// //用户名密码令牌
// UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// //记住我
// token.setRememberMe(true);
// try {
// //调用Suject.login方法 ---》安全管理器--->认证器 ,授权器
// currentUser.login(token);
// } catch (UnknownAccountException uae) {//账号不存在
// log.info("There is no user with username of " + token.getPrincipal());
// } catch (IncorrectCredentialsException ice) {//密码错误
// log.info("Password for account " + token.getPrincipal() + " was incorrect!");
// throw new IncorrectCredentialsException("密码错误");
// } catch (LockedAccountException lae) {//账号锁死
// log.info("The account for username " + token.getPrincipal() + " is locked. " +
// "Please contact your administrator to unlock it.");
// }
// // ... catch more exceptions here (maybe custom ones specific to your application?
// catch (AuthenticationException ae) {
// //unexpected condition? error?
// }
// }
@Controller
@RequestMapping("/user")
public class UserController extends BaseController{ //获取日志对象
private static final transient Logger log= LoggerFactory.getLogger(UserController.class); @RequestMapping("/login")
public String login(String username,String password, HttpSession session){ //获得封装的对象
Subject currentUser= SecurityUtils.getSubject(); //获得的令牌中的信息
UsernamePasswordToken token = new UsernamePasswordToken(username, password); //记住我
token.setRememberMe(true); currentUser.login(token); //密码正确 就让它 跳转到指定的页面
return "view/ok";
} }

三、 使用   @ControllerAdvice  +    @ExceptionHandler  注解

3.1 同步方式。       就不需要再继承,直接创建一个exception  controller  。

package com.aaa.controller;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; /*
* 建立异常的 处理器。
*
* 通知 advice 把这个controller 当做一个切面
* 把这个方法当做切面加到 代理到个个 执行的过程中
* */
@ControllerAdvice //切面 aop的思想
public class ExceptionController { @ExceptionHandler(RuntimeException.class)
public String handler1(RuntimeException ex, Model model){
if (ex instanceof AuthenticationException){
model.addAttribute("ex",ex);
return "error";
}else if (ex instanceof AuthorizationException){
model.addAttribute("ex",ex);
return "error";
}
return "error";
} }

3.2 异步方式。  返回json数据

1.创建实体类

2.下载  lombok  jar包 ,自动生成一些set get 方法。

package com.aaa.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; /*
* 实体类中定义 状态码等属性
*
* lombok 自动生成实体类中的属性 加上注解即可
*
* */
@Data
@AllArgsConstructor //代餐的构造函数
@NoArgsConstructor //空参
@ToString
public class Result {
private Integer satusCode;
private String message;
}

3.控制层

package com.aaa.controller;

import com.aaa.entity.Result;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; /*
* 一、 建立异常的 处理器。
* 通知 advice 把这个controller 当做一个切面
* 把这个方法当做切面加到 代理到个个 执行的过程中
*
*
* 二、异步方式
* 1.自定义实体类 下载lombok 使用注解。
* 2.控制器中返回 json数据格式。
* */
@ControllerAdvice //切面 aop的思想
public class ExceptionController { // @ExceptionHandler(RuntimeException.class)
// public String handler1(RuntimeException ex, Model model){
// if (ex instanceof AuthenticationException){
// model.addAttribute("ex",ex);
// return "error";
// }else if (ex instanceof AuthorizationException){
// model.addAttribute("ex",ex);
// return "error";
// }
// return "error";
// } @ExceptionHandler(RuntimeException.class)
@ResponseBody
//返回定义的实体类 result 就不能用视图 model 就不要了。
//对象当做json数据返回。
public Result handler1(RuntimeException ex){ Result result = new Result(); if (ex instanceof AuthenticationException){
//返回一个状态码 自定义
result.setSatusCode(501);
result.setMessage("密码认证异常"+ex.getMessage());
}else if (ex instanceof AuthorizationException){
result.setSatusCode(502);
result.setMessage("授权异常"+ex.getMessage());
} return result; } }

4. 效果

四,实现异常处理的接口  HandlerExceptionResolver

package com.aaa.controller;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; //了解一下。
public class ExceptionDemo implements HandlerExceptionResolver {
@Override //返回一个model 视图 还需要 配置xml文件
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
return null;
}
}

spring 异常处理的方式?的更多相关文章

  1. Spring 异常处理三种方式 @ExceptionHandler

    异常处理方式一. @ExceptionHandler 异常处理方式二. 实现HandlerExceptionResolver接口 异常处理方式三. @ControllerAdvice+@Excepti ...

  2. Spring异常处理@ExceptionHandler

    最近学习Spring时,认识到Spring异常处理的强大.之前处理工程异常,代码中最常见的就是try-catch-finally,有时一个try,多个catch,覆盖了核心业务逻辑: try{ ... ...

  3. Unit06: Spring对JDBC的 整合支持 、 Spring+JDBC Template、Spring异常处理

    Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架 ...

  4. spring有三种启动方式

    spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn spring3.0及以后版本中已经删除Co ...

  5. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  6. Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式

    转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236  Spring获取ApplicationContex ...

  7. mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类

    相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...

  8. 程序配置的原则和实践以及 Spring Boot 支持方式

    原则 软件需要在不同的环境中部署,代码是保持不变的,但是不同的运行环境存在差异,所以需要使用配置适应不同的环境.比如: 数据库,Redis,以及其他 后端服务 的配置: 第三方服务的证书,如 oAut ...

  9. Spring 依赖注入方式详解(四)

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...

随机推荐

  1. 【剑指Offer】变态跳台阶 解题报告(Python)

    题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级 ...

  2. 【LeetCode】74. Search a 2D Matrix 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 左下或者右上开始查找 顺序查找 库函数 日期 题目地 ...

  3. B. Destroying Roads

    Destroying Roads 题目链接 题意 n个点,m条边每两个点之间不会有两个相同的边,然后给你两个起s1,s2和终点t1,t2; 求删除最多的边后满足两个s1到t1距离\(<=l1\) ...

  4. Mobile phones(poj1195)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 18453   Accepted: 8542 De ...

  5. Feign动态调用,结合Ribbon

    代码如下,三种方法: import org.springframework.beans.factory.annotation.Autowired;import org.springframework. ...

  6. [数据结构]常见数据结构的typedef类型定义总结

    目录 数据结构类型定义: 1.线性表 线性表(顺序存储类型描述): 线性表(动态存储类型描述) 2.线性表的链式表示 双链表的结点类型描述: 静态链表结点类型的描述: 3.栈的数据结构 顺序栈的数据结 ...

  7. linux端口开放关闭 firewalld 使用

    systemctl status firewalld # 查看防火墙状态 firewall-cmd --zone=public --add-port=27017/tcp --permanent # m ...

  8. 执行jar包指定main

    java包中多个main,需要指定执行java -cp iot-device-sdk-java-0.0.5-SNAPSHOT.jar com.inspur.iot.client.sample.paho ...

  9. SpringBoot集成MyBatis-Plus框架

    1.说明 本文介绍Spring Boot集成MyBatis-Plus框架, 重点介绍需要注意的地方, 是SpringBoot集成MyBatis-Plus框架详细方法 这篇文章的脱水版, 主要是三个步骤 ...

  10. 前端在线学习网站W3School

    W3School在线学习网站 http://www.w3school.com.cn/ W3School是因特网上最大的WEB开发者资源,是完全免费的,是非营利性的, 一直在升级和更新,是W3C中国社区 ...