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;
        }
    }
     

  • 相关阅读:
    gerrit 修改前一次提交的方法(转载)
    数据结构实验之图论六:村村通公路 【克鲁斯卡尔算法】
    数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
    数据结构实验之图论四:迷宫探索【dfs 求路径】
    Java 【打印俄文的英文字母】
    【留给自己的独白,长大了】
    Java 【 ArrayList应用 】 (SDUT 4069 C~K的班级)
    你的勇气去哪里了
    Java的 「 “ 结构体 ”」 与 「 “ 自定义排序 ” 」
    Java 中的 SimpleDateFormat 【 parse 和 format 】【转换时间格式】
  • 原文地址:https://www.cnblogs.com/HQ0422/p/14273011.html
Copyright © 2011-2022 走看看