点击查看上一章

在我们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拦截器与异常处理的更多相关文章

  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. 第25月25日 urlsession

    1. private lazy var session: URLSession = { let configuration = URLSessionConfiguration.default conf ...

  2. 合肥学院第二届卓越IT-程序设计大赛E+J

    E链接 小飞有nn的魔法纸片(可以变出糖果), 现在有m个人来找小飞玩游戏, 小飞希望用魔法纸片来使朋友们开心,纸片可以被随便裁剪,nn的魔法纸片可以裁剪成任意大小的小魔法纸片,小飞通过pubgoso ...

  3. java使用Iterator 迭代器

    在springboot中,findall返回的类型为Iterable, Iterator 常用方法: hasnext() next(); Iterable<User> iterable = ...

  4. jq中的事件委托:closest,parent,parents,delegate

    closest .closest(selector) 从当前元素开始沿 DOM 树向上,获得匹配第一个符合选择器的祖先元素,返回零个或一个元素的 jQuery 对象. .parents() 和 .cl ...

  5. Faster_RCNN 2.模型准备(上)

    总结自论文:Faster_RCNN,与Pytorch代码: 本文主要介绍代码第二部分:model/utils , 首先分析一些主要理论操作,然后在代码分析里详细介绍其具体实现. 一. 主要操作 1. ...

  6. inception_v2版本《Rethinking the Inception Architecture for Computer Vision》(转载)

    转载链接:https://www.jianshu.com/p/4e5b3e652639 Szegedy在2015年发表了论文Rethinking the Inception Architecture ...

  7. Linux 文件系统IO性能优化【转】

    转自:https://blog.csdn.net/doitsjz/article/details/50837569 对于LINUX SA来说,服务器性能是需要我们特别关注的,包括CPU.IO.内存等等 ...

  8. Nginx安装及配置详解【转】

    nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...

  9. 提高Django高并发性的部署方案(Python)

    方案: nginx + uWSGI 提高 Django的并发性        1. uWSGI :                 uWSGI是一个web服务器,实现了WSGI协议.uwsgi协议.h ...

  10. makefile实例

    #.PHONY:cleanall cleanobj cleandiff #cleanall:cleandiff cleanobj # rm program #cleanobj: # rm obj.c ...