• 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 执行了....
      
  • 相关阅读:
    数字麦克风PDM信号采集与STM32 I2S接口应用(四)--单片机源码
    Golang SQL连接池梳理
    Ghost-无损DDL
    蛮好用的网站
    齿轮
    water
    折纸 (模拟)
    不等式(数学)
    周期串查询
    大集训模拟赛十一
  • 原文地址:https://www.cnblogs.com/jinchengll/p/11792657.html
Copyright © 2020-2023  润新知