一、使用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. select......for update会锁表还是锁行

    select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键. 没用索 ...

  2. 云南农业职业技术学院 - 互联网技术学院 - 美和易思《MYSQL 高级查询与编程》 综合机试试卷

    数据库及试题文档下载:https://download.csdn.net/download/weixin_44893902/14503097 目录 题目:电商平台 mysql 数据库系统管理 一. 语 ...

  3. Lombok的利弊

    1.介绍 Lombok是一个可以大量减少代码的工具, 通过Pluggable Annotation Processing API的方式解析注解, 在编译期为class文件注入getter,setter ...

  4. html 基础 vscode的常用快捷键

    1.ctrl+/ //注释代码 2.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 3.移动当前行,向上alt+up(方向键↑) ...

  5. let var const 区别

    let es6 语法 let是作用域是块级的,即{}内的范围 如果未声明变量就使用的话,报错ReferenceError,而var则会报错undefined(不存在变量提升) 只要块级作用域内存在le ...

  6. js几种常见排序的实现

    1. 冒泡排序 定义: 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个 数据交换. 这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第 ...

  7. HBase环境搭建(hbase1.2.5+zookeeper3.4.6)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627857018461880836/ 系统版本,Hadoop已安装完成 Mysql安装完成 Hive版本 Sqoo ...

  8. 几张图解释明白 Kubernetes Ingress

    来源:K8s技术圈 作者:阳明 Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到 ...

  9. PkavHTTPFuzzer爆破带验证码的后台密码

    之前对暴力破解这块并没有做系统的总结,况且登录这块也是个重头戏,所以我想总结总结. 环境准备 1.用phpstudy搭建phpwms1.1.2演示环境 2.pkavhttpfuzzer工具 漏洞复现 ...

  10. python2.7发送邮件失败之——邮箱安全问题

    使用python2.7发送邮件,通过脚本调试,脚本运行通过成功发出了邮件,但是目标邮箱qq没有收到. 刚开始怀疑脚本问题,上网查找资料后,发现邮箱发送成功后目标邮件没有收到有可能有以下几种原因: 1. ...