(十五)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后面的拦截器都不会得到执行了 ,就像一个链子一样,在此断掉了(拦截链);

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

原文地址:https://www.cnblogs.com/young-youth/p/11665649.html