1.拦截器的作用

SpringMVC中的拦截器在功能上类似于Servlet上的过滤器Filter,用于对处理器(Controller类)的预处理和后处理。拦截器可以有多个,多个连接器组成拦截器链。

它与Servlet的过滤器主要有如下区别:

  • 过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
  • 拦截器只会拦截访问的控制器方法,如果访问的是jsp,html,css,image等是不会进行拦截的。

2.编写拦截器的类

要想自定义拦截器,必须要实现HandlerInterceptor接口,该接口中的方法无需都要重写,需要哪个用哪个即可。它里面包含三个方法:预处理、后处理、页面加载完处理。

public class MyInterceptor1 implements HandlerInterceptor {

    /**
     * 预处理方法,也就是控制器方法执行前执行
     * 如果return true表示放行,执行下一个拦截器,如果return false则表示不放行,可以跳转到别的页面
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1预处理方法执行了......");
        return true;
    }

    /**
     * 后处理方法,也就是控制器方法执行完、页面加载前执行
     * 可以释放一些资源,比如关闭流
     * 无返回值
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1后处理方法执行了......");
    }


    /**
     * 页面加载完才执行的方法
     * 这里跳不了别的页面
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1页面加载后执行的方法执行了......");
    }
} 

3.配置拦截器类

在springmvc.xml里面配置如下:

<!--配置拦截器-->
<mvc:interceptors>
    <!--配置单个拦截器-->
    <mvc:interceptor>
        <!--配置要拦截的具体方法
            /user/xxx:表示拦截某个具体方法
            /**:表示拦截所有方法
        -->
        <mvc:mapping path="/**"/>

        <!--配置拦截器对象-->
        <bean id="myInterceptor1" class="com.eastnotes.interceptor.MyInterceptor1"></bean>
    </mvc:interceptor>
</mvc:interceptors>

4.拦截器链

多个拦截器只需要多写一个拦截器,多写一个配置就好。单个执行器的执行流程都是一样的。