点击查看上一章

在我们SpringMVC中也可以使用拦截器对用户的请求进行拦截,用户可以自定义拦截器来实现特定的功能。自定义拦截器必须要实现HandlerInterceptor接口

  1. package com.spring.mvc.interceptor;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5.  
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8.  
  9. /**
  10. * @author:SimpleWu
  11. * @to:拦截器执行流程:preHandle - 目标方法 - postHandle -渲染视图 - afterCompletion
  12. */
  13. public class MyInterceptor implements HandlerInterceptor{
  14.  
  15. /**
  16. * 渲染视图之后被调用
  17. * 释放资源
  18. */
  19. @Override
  20. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  21. throws Exception {
  22. System.out.println("[MyInterceptor] afterCompletion");
  23. }
  24. /**
  25. * 该方法是在目标方法之后,渲染视图之前被调用
  26. * 可以对请求域中的参数或视图做出修改
  27. */
  28. @Override
  29. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  30. throws Exception {
  31. System.out.println("[MyInterceptor] postHandle");
  32. }
  33. /**
  34. * 该方法在目标方法前调用
  35. * 1)如果返回值为true则继续调用后续的拦截器和目标方法
  36. * 2)如果返回值为false则不会调用后续的拦截器和目标方法
  37. * 可以考虑做权限,日志。
  38. */
  39. @Override
  40. public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
  41. System.out.println("[MyInterceptor] preHandle : 目标方法之前被调用。");
  42. return true;
  43. }
  44.  
  45. }

然后我们需要在SpringMVC中配置拦截器。

  1. <mvc:interceptors>
  2. <!-- 配置自定义拦截器 -->
  3. <bean id="myInterceptor" class="com.spring.mvc.interceptor.MyInterceptor"/>
  4. <mvc:interceptor>
  5. <!-- 配置拦截器的作用路径 -->
  6. <mvc:mapping path="/user/*"/>
  7. <!--
  8. 配置拦截器不作用的路径
  9. <mvc:exclude-mapping path=""/>
  10. -->
  11. <bean class="com.spring.mvc.interceptor.UserInterceptor"/>
  12. </mvc:interceptor>
  13. </mvc:interceptors>

如果我们配置了作用的路径那么我们现在只有user/*后面的请求它才会被我们的拦截器给拦截。

在我们拦截器中执行顺序:首先调用preHandler方法然后进入请求的业务方法之后出来的时候会先调用postHandler这个方法(业务方法前,视图渲染后),最后视图渲染之后调用拦截器的afterCompletion方法。

如果我们有多个拦截器那么他会按照配置顺序执行preHandler,按逆方向执行postHandler与afterCompletion方法。

假如我们有两个拦截器,在第一个拦截器的preHandler中返回false那么所有的方法都不会执行,如果我们在第二个拦截器返回false第一个拦截器还会多执行一个afterCompletion方法。

SpringMVC异常处理

在SpringMVC中异常的处理与Struts2有点类似。

SpringMVC通过HandlerExceptionResolver处理程序异常,包括Handler映射,数据绑定以及目标方法执行时所发生的异常。

SpringMVC中默认是没有加装载HandlerExceptionResolver,我们需要在SpringMVC.xml中配置

  1. <mvc:annotation-driven />

我们可以在Controller类中定义一个局部(方法所在类)的异常处理的方法

  1. /**
  2. * 在这个方法中可以加入Exception类型的参数,该参数即对于发生的异常对象
  3. * 入参中不能传入map,若希望吧异常信息传到页面上需要使用ModelAndView作为返回值
  4. */
  5. @ExceptionHandler({NullPointerException.class})
  6. public String handlerNullPointerException(Exception ex){
  7. System.out.println("异常 : " + ex);
  8. return "error";
  9. }

这个方法他会针对这个类中的NullPointerException异常将他捕获,然后执行这个方法。如果我们希望在页面上显示异常信息的话我们只需要返回ModelAndView即可。

除了这种局部异常我们还可以配置全局异常处理类,这个类需要使用注解@ControllerAdvice修饰。

  1. package com.spring.mvc.exceptionprocess;
  2.  
  3. import org.springframework.web.bind.annotation.ControllerAdvice;
  4. import org.springframework.web.bind.annotation.ExceptionHandler;
  5. import org.springframework.web.servlet.ModelAndView;
  6.  
  7. /**
  8. * @author SimpleWu
  9. * @ControllerAdvice:如果在当前Handler找不到当前方法出现的异常则将来这个注解标记的类中查找处理异常。
  10. * 意为定义一个全局异常
  11. */
  12. @ControllerAdvice
  13. public class UserException {
  14.  
  15. @ExceptionHandler({NullPointerException.class})
  16. public ModelAndView handlerNullPointerException(Exception ex){
  17. System.out.println("[异常] : " + ex);
  18. ModelAndView mav = new ModelAndView("error");
  19. mav.addObject("exception",ex);
  20. return mav;
  21. }
  22. }

当然在开发我们可能在上面的类中有两个方法例如一个是RuntimeException和NullPointerException那么他会调用那个捕获方法呢?

它不会应为RuntimeException可以匹配就匹配这个他会根据最靠近这个异常的类型去匹配。

定制异常页面

在网站中如果我们发生页面不存在我们能够看到页面显示:

在这里我们可以自定义异常显示。我们可以定义一个异常类使用@ResponseStatus注解修饰

  1. package com.spring.mvc.exception;
  2.  
  3. import org.springframework.http.HttpStatus;
  4. import org.springframework.web.bind.annotation.ResponseStatus;
  5.  
  6. /**
  7. * @author SimpleWu
  8. * 当捕获当这个异常后更改错误提示
  9. */
  10. @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用户密码为空")
  11. public class UserPassIsNullException extends RuntimeException{
  12. private static final long serialVersionUID = 1L;
  13. }

在这里我们定义了一个异常,如果在请求的方法中抛出我们的异常,页面就会显示我们定制的状态码与提示信息。

SimpleMappingExceptionResolver:

如果希望对异常进行统一处理我们可以装配这个bean,将它的异常类名映射为视图名,发生异常时使用对应视图报告异常

  1. <!--
  2. 配置SimpleMappingExceptionResolverl来映射异常
  3. 相当于捕获一个全局异常
  4. -->
  5. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  6.  
  7. <!-- 自定义异常属性名字 -->
  8. <property name="exceptionAttribute" value="ex"/>
  9. <property name="exceptionMappings">
  10. <props>
  11. <!-- 捕获到java.lang.ArithmeticException异常跳转error.jsp页面 -->
  12. <prop key="java.lang.ArithmeticException">error</prop>
  13. </props>
  14. </property>
  15. </bean>

如果我们捕获到这个算数异常那么我们就会返回error视图。本该在jsp中我们的页面上显示异常默认使用exception现在名字换成了ex

SpringMVC拦截器与异常处理的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  2. SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...

  3. SpringMVC拦截器及多拦截器时的执行顺序

    本文链接:https://blog.csdn.net/itcats_cn/article/details/80371639拦截器的配置步骤 springmvc.xml中配置多个拦截器配置自定义拦截器并 ...

  4. SpringMVC拦截器的使用

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  5. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  6. SpringMVC拦截器2(资源和权限管理)(作为补充说明)

    SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...

  7. SpringMVC拦截器(实现登录验证拦截器)

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...

  8. SpringMVC拦截器Interceptor

    SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter. SpringMVC 中的Interceptor 拦截请求是通过Ha ...

  9. 五 : springMVC拦截器

    springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方式是继承实现了HandlerInte ...

随机推荐

  1. lua 语法的使用总结

    1.字符串连接 local tmp = "abc" local tmp1 = "ddd" tmp..tmp1 2. table 类型 就是关联数组 local ...

  2. mongodb系列~配置文件的优化与处理

    一 简介:讲讲如何优化mongo配置文件二 常规参数     port= //端口     fork=true//守护进程方式启动mongo     logpath=shard.log //mongo ...

  3. Django学习手册 - pycharm 安装/建立第一个网站hello world

    步骤阐述: 1.下载 pycharm 安装包,安装pycharm 2.打开pycharm软件,新建工程项目 3.新建APP,配置url,启动项目 步骤1: pycharm 官网下载: https:// ...

  4. java基础梳理--朝花夕拾(一)

    简介: Java是一种撰写跨平台应用软件的面向对象语言,1995年由Sun Microsystems公司推出. 2009年04月20日,甲骨文74亿美元收购Sun,取得java的版权. 2011年7月 ...

  5. 中国各省市县级 JSON 文件

    参考链接:https://blog.csdn.net/lzhlzz/article/details/41347929

  6. 困在栅栏里的恺撒WriteUp(附栅栏密码加密解密脚本)

    题目地址:http://www.shiyanbar.com/ctf/1867 这道题目并不难,就是先用栅栏密码解密,然后再用恺撒密码解密就好. 1. 6代表了栅栏密码的栏数(说实话,一开始我也没看出来 ...

  7. C 和 C++ 一些基础

    位运算: Part1: #include <iostream> using namespace std; int main(int argc, char *argv[]) { //unsi ...

  8. 【转】python编写规范——中标软件有限公司测试中心

    [转]python编写规范 一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准 ...

  9. BZOJ 3620: 似乎在梦中见过的样子

    似乎在梦中见过的样子.... 一道水题调了这么久,还半天想不出来怎么 T 的...佩服自己(果然蒟蒻) 这题想想 KMP 但是半天没思路瞟了一眼题解发现暴力枚举起始点,然后 KMP 如图: O( n2 ...

  10. 全系列Unity4.x.x到2017.1.1破解Win&Mac!最新Unity2017.1.1p3&4.7.2f1破解!

    Unity官网所有版本下载地址请戳: http://unity3d.com/unity/download/archive 补丁版本请戳: http://unity3d.com/cn/unity/qa/ ...