(十四) Spring MVC 拦截器

(十四) Spring MVC 拦截器

 

1、简介

    Spring MVC  中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),但是功能比过滤器强大,它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义

  1. 通过实现 HandlerInterceptor 接口
  2. 继承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>

注意:如果有多个拦截器,拦截器配置的顺序决定了拦截器的执行顺序,先配置会先被执行!

 

如果存在多个拦截器,拦截规则如下:

  1. preHandle 按拦截器定义顺序调用
  2. postHandler 按拦截器定义逆序调用
  3. afterCompletion 按拦截器定义逆序调用
  4. postHandler 在拦截器链内所有拦截器返回成功调用
  5. afterCompletion 只有 preHandle 返回 true 才调用

 

posted @ 2021-07-25 17:36  邓维-java  阅读(127)  评论(0)    收藏  举报