zoukankan      html  css  js  c++  java
  • Interceptor拦截器对一次请求进行多次拦截

    配置拦截器后拦截器会对一个请求进行多次拦截
    /**
     * 拦截器
     * */
    public class TokenInterceptor implements HandlerInterceptor {
    
        /*
        * 在DispatcherServlet之前执行
        * */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//从请求头内获取tokne
             String token = request.getHeader("token");
             if(verifyToken(token)){
               log.info("token验证成功");
               return true;
             }
             log.error("token验证失败");
             return false;
        }
    }
    @Configuration
    public class InterceptorConfig extends WebMvcConfigurationSupport {
    
        /**
         * springBoot2.0后配置拦截器需要extends 的 WebMvcConfigurerAdapter 已经过时,取而代之的是 WebMvcConfigurationSupport
         * WebMvcConfigurerAdapter 只是对 WebMvcCofigurer 的空实现,而WebMvcConfigurerSupport对WebMvcCofigurer的实现更全面,
         * 但是继承WebMvcConfigurerSupport之后SpringBoot的webMvc自动配置会失效,导致视图解析器无法解析并返回对应的视图,如果需要返回逻辑视图就继承WebMvcCofigurer
         *
         * WebMvcConfigurationSupport 在整个程序中只会生效一个,如果实现了WebMvcConfigurationSupport类,那么继承WebMvcConfigurer的类将不会生效
         *
         * WebMvcConfigurationSupport是重写默认配置,而WebMvcConfigurerAdapter是在默认配置的上面增加扩展
         * */
    
        @Autowired
        private BaseAPI baseAPI;
    
        @Value("${request.whitelist}")
        private String whitelist;//请求白名单//配置拦截器,拦截请求验证tokne
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            String[] whites = whitelist.split(",");
                                                                               //设置拦截的请求       //设置不拦截的请求
            registry.addInterceptor(new TokenInterceptor(baseAPI)).addPathPatterns("/**").excludePathPatterns(whites);
        }
    }

    在请求中发现当执行完毕查询后又回到了拦截器中,再次回到拦截器中时就得不到header中的tokenl了,是因为有静态资源访问导致的增加配置

    //增加判断过滤调静态资源访问,这样只有第一次请求会进入,之后的请求都不会进入了
    if (handler instanceof ResourceHttpRequestHandler){
        return true;
    }

    完整代码

    /**
     * token拦截器
     * */
    @Slf4j
    public class TokenInterceptor implements HandlerInterceptor {
    
        private BaseAPI baseAPI;
    
        /*
        * 在DispatcherServlet之前执行
        * */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     if (handler instanceof ResourceHttpRequestHandler){
              return true;
            }
            //从请求头内获取tokne
            String token = request.getHeader("token");
            if(verifyToken(token)){
               log.info("token验证成功");
               return true;
            }
            log.error("token验证失败");
            return false;
        }
    }
     

  • 相关阅读:
    mysql主从原理
    mysql锁和事物隔离
    mysql索引查找原理及调优
    MySQL高级查询
    周总结04
    冲刺第六天
    冲刺第五天
    冲刺第四天
    典型用户模板和用户场景模版
    冲刺第三天
  • 原文地址:https://www.cnblogs.com/HQ0422/p/14273011.html
Copyright © 2011-2022 走看看