(十四) Spring MVC 拦截器
(十四) Spring MVC 拦截器
1、简介
Spring MVC 中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),但是功能比过滤器强大,它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
- 通过实现 HandlerInterceptor 接口
- 继承HandlerInterceptor接口的实现类(如:HandlerInterceptorAdapter)来定义。
2、编写自定义拦截器
/**
* 自定义拦截器
*/
@Component
public class MyInterceptor implements HandlerInterceptor{
/**
*preHandle: 在控制器(目标)的方法之前被执行
* 返回值:控制afterCompletion方法是否被执行
* true: 执行 afterCompletion
* false: 不执行 afterCompletion
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor的preHandle");
return true;
}
/**
* postHandle: 在控制器(目标)的方法成功执行完成之后(注意:控制器方法失败不执行)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor的postHandle");
}
/**
* afterCompletion: 在执行完前面所有(拦截器和目标)的方法之后执行(注意: 不管控制器方法执行成功与否都会被执行 )
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor的afterCompletion");
}
}
3、springmvc.xml配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置My拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.dw.study.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
注意:如果有多个拦截器,拦截器配置的顺序决定了拦截器的执行顺序,先配置会先被执行!
如果存在多个拦截器,拦截规则如下:
- preHandle 按拦截器定义顺序调用
- postHandler 按拦截器定义逆序调用
- afterCompletion 按拦截器定义逆序调用
- postHandler 在拦截器链内所有拦截器返回成功调用
- afterCompletion 只有 preHandle 返回 true 才调用