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 }

 如下图

原文地址:https://www.cnblogs.com/qiujz/p/13229921.html