SpringMVC中的拦截器

1、拦截器的作用

Spring MVC 的处理器拦截器类似于Servlet开发中的Filter,用于对处理器进行预处理和后处理。

用户可以自定义一些拦截器来实现特定的功能。

谈到拦截器,就想到——拦截器链。拦截器链就是将拦截器按一定的顺序链接成一条链。在访问被拦截的方法和字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

它与过滤器有几分相似,区别如下:

  1. 过滤器是servlet规范中的一部分,任何java web功能都可以使用。
  2. 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
  3. 过滤器是url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
  4. 拦截器它只是会拦截访问的控制器(@Controller)方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。

它也是AOP思想的具体应用。

我们要想自定义拦截器,必须实现:HandlerInterception接口。

2、自定义拦截器的步骤

  1. 编写自定义拦截器类

    public class MyInterceptor1 implements HandlerInterceptor
    {
        /**
         * 预处理,controller方法执行之前
         * 返回true:放行,执行下一个拦截器或者controller方法
         * 返回false:不放行
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
        {
            System.out.println("MyInterceptor1.preHandle 执行了....");
            //如果当前出现问题,可以直接跳转到错误界面,返回false不执行controller方法
            //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
            //return false
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
        {
            System.out.println("MyInterceptor1.postHandle 执行了....");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
        {
            System.out.println("MyInterceptor1.afterCompletion 执行了....");
        }
    }
    
    
  2. 配置拦截器

    在Springmvc.xml文件中:

    <!--配置自定义拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--要拦截的具体方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的具体方法
                <mvc:exclude-mapping path=""/> -->
            <!--配置拦截器对象-->
            <bean class="com.lin.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>
    
  3. 执行顺序如下

    MyInterceptor1.preHandle 执行了....
    testInterception执行了。。。
    MyInterceptor1.postHandle 执行了....
    success.jsp 执行了。。。
    MyInterceptor1.afterCompletion 执行了....
    

3、使用拦截器链(多个拦截器)

  1. 增加自定义拦截器类

    public class MyInterceptor2 implements HandlerInterceptor
    {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
        {
            System.out.println("MyInterceptor2.preHandle 执行了....");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
        {
            System.out.println("MyInterceptor2.postHandle 执行了....");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
        {
            System.out.println("MyInterceptor2.afterCompletion 执行了....");
        }
    }
    
  2. 配置多个拦截器

    在Springmvc.xml文件中:

    <!--配置自定义拦截器-->
    <mvc:interceptors>
        <!--配置第一个拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的具体方法
                <mvc:exclude-mapping path=""/> -->
            <!--配置拦截器对象-->
            <bean class="com.lin.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
        
        <!--配置第二个拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的具体方法
                <mvc:exclude-mapping path=""/> -->
            <!--配置拦截器对象-->
            <bean class="com.lin.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>
    
  3. 执行顺序如下:

    MyInterceptor1.preHandle 执行了....
    MyInterceptor2.preHandle 执行了....
    testInterception执行了。。。
    MyInterceptor2.postHandle 执行了....
    MyInterceptor1.postHandle 执行了....
    success.jsp 执行了。。。
    MyInterceptor2.afterCompletion 执行了....
    MyInterceptor1.afterCompletion 执行了....
    
原文地址:https://www.cnblogs.com/jinchengll/p/11792657.html