一、 拦截器的概述
- Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理。通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
- SpringMVC的拦截器是用于对处理器进行预处理和后处理的技术,甚至可以在渲染视图后进行操作。
- 拦截器也是AOP思想的一种实现方式
- 过滤器
- 是Servlet规范的一部分,所有的web项目都可以使用
- 过滤器在web.xml配置(可以使用注解),能够拦截所有web请求
- 拦截器
- 是SpringMVC框架的实现,只有在SpringMVC框架中才能使用
- 拦截器在SpringMVC配置文件进行配置,不会拦截SpringMVC放行的资源(jsp\html\css…)
二、拦截器的定义
定义一个拦截器可以通过两种方式:
通过实现HandlerInterceptor接口或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
通过实现WebRequestInterceptor接口或继承WebRequestInterceptor接口的实现类来定义。
拦截器常用方法:
-
preHandle()方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作。返回true表示继续向下执行,返回false表示中断后续操作。
-
postHandle()方法:该方法在控制器的处理请求方法调用之后,解析视图之前执行。可以通过此方法对请求域中的模型和视图做进一步的修改。
-
afterCompletion()方法:无论是否产生异常都会在渲染视图后执行的方法。可以通过此方法实现一些资源清理、记录日志信息等工作。
三、拦截器链执行顺序
将多个拦截器按照一定的顺序构成一个执行链
四、自定义拦截器
1.创建拦截器
public class MyInterceptor1 implements HandlerInterceptor {
//预处理方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
System.out.println("--------------预处理");
return true;
}
//后处理方法
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("tips","这是通过拦截器的后处理添加的数据");
System.out.println("--------------后处理");
}
}
2. 在xml文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/book/query"/>
<mvc:mapping path="/book/add"/>
<mvc:mapping path="/student/**"/>
<!-- 配置不需要拦截作用的路径 -->
<mvc:exclude-mapping path="/student/add"/>
<!-- 自定义拦截器bean -->
<bean class="com.pan.utils.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>