zoukankan      html  css  js  c++  java
  • Spring Boot 请求头token拦截 Swagger 支持请求头

    适用接口需授权token才能调用的场景

    @Configuration
    public class WebMvcConfigurer extends WebMvcConfigurationSupport {
    
        //添加拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //接口签名认证拦截器
            registry.addInterceptor(new HandlerInterceptorAdapter() {
                @Override
                public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                    Result result = new Result();
                    String token = request.getHeader("token");
                    //token 校验
                    if (null == token) {
                        result.setCode(ResultCode.UNAUTHORIZED).setMessage("请求 header 缺少 token");
                        responseResult(response, result);
                        return false;
                    }
                    //TODO 进一步校验
                    //endregion
    
                    return true;
                }
            }).excludePathPatterns("/oauth/**");
        }
    
    }        

    其中,excludePathPatterns 为不必校验的路由,如 申请token接口

    如果你用了 Swagger ui,会导致swagger页面也被拦截,再排除

    .excludePathPatterns("/oauth/**")
                    .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");

    这样,swagger就能正常访问了。但默认是不支持请求头的,开发还是不方便,改配置如下

     1 @Configuration
     2 @EnableSwagger2
     3 public class Swagger2Configurer {
     4 
     5     @Bean
     6     public Docket createRestApi(){
     7         ParameterBuilder ticketPar = new ParameterBuilder();
     8         List<Parameter> pars = new ArrayList<>();
     9         ticketPar.name("token").description("user ticket")
    10                 .modelRef(new ModelRef("string")).parameterType("header")
    11                 .required(false).build(); //header中的token参数非必填,传空也可以
    12         pars.add(ticketPar.build());    //根据每个方法名也知道当前方法在设置什么参数
    13 
    14         return new Docket(DocumentationType.SWAGGER_2)
    15                 .apiInfo(apiInfo())
    16                 .select()
    17                 .apis(RequestHandlerSelectors.basePackage("com.***.pub"))
    18                 .paths(PathSelectors.any())
    19                 .build()
    20                 .globalOperationParameters(pars);
    21     }
    22 
    23     private ApiInfo apiInfo() {
    24         return new ApiInfoBuilder()
    25                 .title("*********开放接口")
    26                 .version("1.0.0")
    27                 .build();
    28     }
    29 }

     如下图

  • 相关阅读:
    Java的多线程机制系列:(二)缓存一致性和CAS
    Java的多线程机制系列:(一)总述及基础概念
    pydev常用快捷键
    利用python的pyinotify模块监控文件夹和文件的变动
    Linux 下文件名乱码(无效的编码)的解决办法
    ubuntu 中文界面下中文文件夹改英文
    SystemParametersInfo
    jsp:forward与缓冲区
    kafka:(9) 流式处理
    kafka:(8) 事务、幂等
  • 原文地址:https://www.cnblogs.com/qiujz/p/13229921.html
Copyright © 2011-2022 走看看