- 拦截器的定义
- 拦截器的配置
- 拦截器的执行流程
一、拦截器的概述
Spring MVC的拦截器(Intercept)与Java Servlet的过滤器(Filter)类型,主要用于拦截用户的请求并做相应的处理,通常在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
1.1 拦截器的定义
在Spring MVC框架中定义一个拦截器需要对拦截器进行定义和配置,定义一个拦截器可以通过两种方式:
- 通过实现HandlerInterceptor接口或者继承HandlerInterceptor接口的实现类来定义
- 通过实现WebRequestInterceptor或者继承WebRequestInterceptor接口的实现类来定义
比如实现HandlerInterceptor接口:
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
实现HandlerInterceptor接口,实现了接口中的3种方法:
- preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回true表示继续向下执行,返回false表示中断后续操作。
- postHandle 方法:该方法在控制器的处理请求调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
1.2 拦截器的配置
自定义拦截器生效需要在Spring MVC的配置文件中进行配置。
<!--配置拦截器-->
<mvc:interceptors>
<!--配置一个全局拦截器,拦截所有请求-->
<bean class="main.java.springmvc.utils.UserInterceptor"/>
<mvc:interceptor>
<!--配置拦截器作用的路径-->
<mvc:mapping path="/**"/>
<!--配置不需要拦截器作用的路径-->
<mvc:exclude-mapping path=""/>
<!--定义在 <mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截-->
<bean class=""
</mvc:interceptor>
</mvc:interceptors>
- <mvc:interceptors> 用于配置一组拦截器
- <bean >定义的是全局拦截器,拦截所有请求
- <mvc:interceptor>指定路径的拦截器,顺序不能变!
二、拦截器的执行流程
2.1 单个拦截器的执行流程
1. 准备拦截器类
/**
* @author xry
*/
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法控制器的处理请求方法前执行");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法在控制器的处理请求调用之后、解析视图之前执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,