SpringMVC拦截器与异常处理
在我们SpringMVC中也可以使用拦截器对用户的请求进行拦截,用户可以自定义拦截器来实现特定的功能。自定义拦截器必须要实现HandlerInterceptor接口
package com.spring.mvc.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; /**
* @author:SimpleWu
* @to:拦截器执行流程:preHandle - 目标方法 - postHandle -渲染视图 - afterCompletion
*/
public class MyInterceptor implements HandlerInterceptor{ /**
* 渲染视图之后被调用
* 释放资源
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("[MyInterceptor] afterCompletion");
}
/**
* 该方法是在目标方法之后,渲染视图之前被调用
* 可以对请求域中的参数或视图做出修改
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("[MyInterceptor] postHandle");
}
/**
* 该方法在目标方法前调用
* 1)如果返回值为true则继续调用后续的拦截器和目标方法
* 2)如果返回值为false则不会调用后续的拦截器和目标方法
* 可以考虑做权限,日志。
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("[MyInterceptor] preHandle : 目标方法之前被调用。");
return true;
} }
然后我们需要在SpringMVC中配置拦截器。
<mvc:interceptors>
<!-- 配置自定义拦截器 -->
<bean id="myInterceptor" class="com.spring.mvc.interceptor.MyInterceptor"/>
<mvc:interceptor>
<!-- 配置拦截器的作用路径 -->
<mvc:mapping path="/user/*"/>
<!--
配置拦截器不作用的路径
<mvc:exclude-mapping path=""/>
-->
<bean class="com.spring.mvc.interceptor.UserInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
如果我们配置了作用的路径那么我们现在只有user/*后面的请求它才会被我们的拦截器给拦截。
在我们拦截器中执行顺序:首先调用preHandler方法然后进入请求的业务方法之后出来的时候会先调用postHandler这个方法(业务方法前,视图渲染后),最后视图渲染之后调用拦截器的afterCompletion方法。
如果我们有多个拦截器那么他会按照配置顺序执行preHandler,按逆方向执行postHandler与afterCompletion方法。
假如我们有两个拦截器,在第一个拦截器的preHandler中返回false那么所有的方法都不会执行,如果我们在第二个拦截器返回false第一个拦截器还会多执行一个afterCompletion方法。
SpringMVC异常处理
在SpringMVC中异常的处理与Struts2有点类似。
SpringMVC通过HandlerExceptionResolver处理程序异常,包括Handler映射,数据绑定以及目标方法执行时所发生的异常。
SpringMVC中默认是没有加装载HandlerExceptionResolver,我们需要在SpringMVC.xml中配置
<mvc:annotation-driven />
我们可以在Controller类中定义一个局部(方法所在类)的异常处理的方法
/**
* 在这个方法中可以加入Exception类型的参数,该参数即对于发生的异常对象
* 入参中不能传入map,若希望吧异常信息传到页面上需要使用ModelAndView作为返回值
*/
@ExceptionHandler({NullPointerException.class})
public String handlerNullPointerException(Exception ex){
System.out.println("异常 : " + ex);
return "error";
}
这个方法他会针对这个类中的NullPointerException异常将他捕获,然后执行这个方法。如果我们希望在页面上显示异常信息的话我们只需要返回ModelAndView即可。
除了这种局部异常我们还可以配置全局异常处理类,这个类需要使用注解@ControllerAdvice修饰。
package com.spring.mvc.exceptionprocess; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView; /**
* @author SimpleWu
* @ControllerAdvice:如果在当前Handler找不到当前方法出现的异常则将来这个注解标记的类中查找处理异常。
* 意为定义一个全局异常
*/
@ControllerAdvice
public class UserException { @ExceptionHandler({NullPointerException.class})
public ModelAndView handlerNullPointerException(Exception ex){
System.out.println("[异常] : " + ex);
ModelAndView mav = new ModelAndView("error");
mav.addObject("exception",ex);
return mav;
}
}
当然在开发我们可能在上面的类中有两个方法例如一个是RuntimeException和NullPointerException那么他会调用那个捕获方法呢?
它不会应为RuntimeException可以匹配就匹配这个他会根据最靠近这个异常的类型去匹配。
定制异常页面
在网站中如果我们发生页面不存在我们能够看到页面显示:
在这里我们可以自定义异常显示。我们可以定义一个异常类使用@ResponseStatus注解修饰
package com.spring.mvc.exception; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; /**
* @author SimpleWu
* 当捕获当这个异常后更改错误提示
*/
@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用户密码为空")
public class UserPassIsNullException extends RuntimeException{
private static final long serialVersionUID = 1L;
}
在这里我们定义了一个异常,如果在请求的方法中抛出我们的异常,页面就会显示我们定制的状态码与提示信息。
SimpleMappingExceptionResolver:
如果希望对异常进行统一处理我们可以装配这个bean,将它的异常类名映射为视图名,发生异常时使用对应视图报告异常
<!--
配置SimpleMappingExceptionResolverl来映射异常
相当于捕获一个全局异常
-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 自定义异常属性名字 -->
<property name="exceptionAttribute" value="ex"/>
<property name="exceptionMappings">
<props>
<!-- 捕获到java.lang.ArithmeticException异常跳转error.jsp页面 -->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
</bean>
如果我们捕获到这个算数异常那么我们就会返回error视图。本该在jsp中我们的页面上显示异常默认使用exception现在名字换成了ex
SpringMVC拦截器与异常处理的更多相关文章
- Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
- SpringMVC拦截器及多拦截器时的执行顺序
本文链接:https://blog.csdn.net/itcats_cn/article/details/80371639拦截器的配置步骤 springmvc.xml中配置多个拦截器配置自定义拦截器并 ...
- SpringMVC拦截器的使用
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMVC拦截器详解[附带源码分析]
目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...
- SpringMVC拦截器2(资源和权限管理)(作为补充说明)
SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...
- SpringMVC拦截器(实现登录验证拦截器)
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...
- SpringMVC拦截器Interceptor
SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter. SpringMVC 中的Interceptor 拦截请求是通过Ha ...
- 五 : springMVC拦截器
springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方式是继承实现了HandlerInte ...
随机推荐
- ubuntu下objective-c的编译和运行
ubuntu 下编译objective-c 1.安装编译环境 sudo aptitude install build-essential gobjc gobjc++ gnustep gnustep-d ...
- 第25月第22日 django channels
1. https://github.com/andrewgodwin/channels-examples/ https://channels.readthedocs.io/en/latest/
- 第24月第30天 scrapy《TensorFlow机器学习项目实战》项目记录
1.Scrapy https://www.imooc.com/learn/1017 https://github.com/pythonsite/spider/tree/master/jobboleSp ...
- jstl-----之<set>标签
<table id="attachtab" border="0" cellpadding="0" cellspacing=" ...
- Leetcode#169. Majority Element(求众数)
题目描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...
- excel打开csv格式的文件,数字末尾都变成零,解决方式
excel打开csv格式的文件,数字末尾都变成零,解决方式
- linux 安装图行界面
centos6的环境中 代码:[root@ebs122 sysconfig]#yum groupinstall "Desktop" 使用 init 5命令进入图形化界面,如果成功的 ...
- go 单引号,双引号,反引号区别
go里面双引号是字符串,单引号是字符,不存在单引号字符串. 但有反引号字符串,就是esc键下面1键左边tab键上面那个键,区别是反引号字符串允许换行符
- 向量的L2范数求导
回归中最为基础的方法, 最小二乘法. \[ \begin{align*} J_{LS}{(\theta)} &= \frac { 1 }{ 2 } { \left\| A\vec { x } ...
- delphi 控件集
delphi 控件集: 1)RAIZE 控件包 :http://www.raize.com/devtools/rzcomps/ 被收购 Raize Components has been ac ...