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 ...
随机推荐
- kvm 搭建
一,准备环境 物理机 虚拟机 操作系统 CentOS 6.8 x64 CentOS 6.8 x64 CPU/内存 10核超线程x2/64G 2核/4G 外网IP -- 内网IP eth1_192. ...
- HMM拓扑与转移模型
<Topology> <TopologyEntry> <ForPhones> 1 2 3 4 5 6 7 8 </ForPhones> < ...
- spring cloud(学习笔记)微服务启动错误(1)
今天下午在启动spring cloud微服务的时候,报了这个错误: Error starting ApplicationContext. To display the auto-configurati ...
- linux系统 之 curl命令
1,curl命令 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工 ...
- Kivy折腾笔记
最近想用Python开发APP,选择kivy,记录过程 首先是源码安装,各种蛋疼的报错放弃了.cython高版本有问题. python3 -m pip install cython==0.23 pyt ...
- Linux下的Jenkins+Tomcat+Maven+Git+Shell环境的搭建使用(jenkins自动化部署)【转】
jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...
- 工程师死绝的世界答案-python3版
エンジニアが死滅シタ世界|アンドロイドとふたりぼっちで生きろ. 荒れ果てた警察署 [MISSION LEVEL: D] 难度D 题目要求: あなたは 0 から 9 の数字を 3 つ入力すると開く扉を開 ...
- python多线程并发
# coding=utf8 # 使用前需安装net-snmp-utils或net-snmp包 from _utils.patrol2 import run_cmd import sys import ...
- Apollo 启动脚本解析
Apollo 启动脚本解析 sudo service docker start -- 是在ubuntu14.04中打开 在dev_start.sh脚本中会调用restart_map_volume.sh ...
- MinGW GCC 7.3.0 2018年1月25日 出炉啦
GCC_7.3.0._for_MSYS2.7z for x86 x64 63.68 MB发布日期: 2018-01-26 下载地址: https://forum.videohelp.com/attac ...