• (十五)springMvc 拦截器


    定义拦截器

    springMvc 中定义拦截器只需要实现一个接口 org.springframework.web.servlet.HandlerInterceptor

    
    public class Myfilter implements HandlerInterceptor {
      ...
    }
    
    

    接口中三个方法

     
       /**
          在执行 handler 之前,执行 进,进行拦截;
         方法返回 true ,则放行;返回false,则拦截 ;
         
         用途:身份认证,权限管理
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return false;
        }
    
        /**
          在执行handler之后,且在返回 modelAndView 之前执行
         
         用途:为 modelAndView 填充一些统一的数据
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        /**
            在执行完 handler 之后(注意是执行完,不是执行),执行 ;
            
            用途: 进行统一的异常处理 ;
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
        
    

    配置拦截器

    springMvc 的拦截器是针对 HandlerMapping 的,也就是一个 拦截器,对应一个 映射器 ,哪个映射器配置了拦截器,那么只有经过该拦截器映射成功的 handler 才会被拦截 ;;

    但是,也可以配置一个 类似 于全局的拦截器,利用 springMvc 将一个拦截器,注入到每一个 映射器 中,就可以完成类似全局拦截器 ;

    1. 配置单个映射器的拦截器

      springMvc.xml 中进行配置 ;

      
       <!--自定义拦截器-->
          <bean class="xin.ijava.ssm.filter.Myfilter" id="myfilter" />
      
        <!--配置单个拦截器-->
          <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
              <property name="interceptors">
                  <list>
                      <ref bean="myfilter"/>
                  </list>
              </property>
          </bean>
      
    2. 配置类似全局的拦截器

      可以配置多了拦截器,类似于拦截链的样子,拦截顺序按照定义的顺序!

          <!--配置类似全局的拦截器-->
          <mvc:interceptors>
              <!--可以配置多个拦截器。按照配置的顺序进行拦截-->
              <mvc:interceptor>
                  <!--配置拦截的url , ** 代表拦截所有,包括子目录-->
                  <mvc:mapping path="/**"/>
                  <bean class="xin.ijava.ssm.filter.Myfilter"/>
              </mvc:interceptor>
      
              <!--再配置一个拦截器-->
             <mvc:interceptor>
                 <mvc:mapping path="/**"/>
                 <bean class="xin.ijava.ssm.filter.Myfilter1"/>
             </mvc:interceptor>
          </mvc:interceptors>
      

    多个拦截器的规则

    这里以 2 个拦截器为例子 ,A,B 两个拦截器,A是第一个,B是第二个;

    1. A、B 都放行

      preHandle 按照拦截器的定义 顺序执行,后两个方法 postHandleafterCompletion ,按照拦截器的定义顺序 逆序执行

    2. A放行,B不放行

      preHandle 方法总是会执行,因为在里面进行判断是否放行 ;

      A拦截器放行,才会执行B拦截器,加强A 没有放行,那么后面的拦截器都不会得到执行;

      只要有一个拦截器不放行,那么所有的拦截器的 postHandle 都不会得到执行 ,但是其他放行的拦截器的 afterCompletion 会得到执行 ;

    3. A,B都不放行

      preHandle 方法总是会执行,因为在里面进行判断是否放行 ;

      由于A 没有放行,那么A后面的拦截器都不会得到执行了 ,就像一个链子一样,在此断掉了(拦截链);

    综合所述,对于统一日志的处理,要放在第一位,并其要放行 ;

  • 相关阅读:
    Hadoop技术内幕——Hadoop配置信息处理
    协程,线程池
    线程知识点(锁,信号量,队列,条件)
    进程的概念
    socketserver网络编程简单的小例子
    socket 发送文件
    网络编程
    正则表达式
    面对对象--多态封装
    创建可管理的属性:property
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665649.html
Copyright © 2020-2023  润新知