后端(11)-springboot拦截器不生效

113 阅读1分钟

Springboot中处理登录接口和其他需要token的接口一般会配置拦截器,登录注册接口不需要token,而其他需要登录后才能操作的接口则在拦截器中获取token,再转发给具体的Controller,这样每一个api都能得到用户信息,来执行具体业务。

问题

拦截器配置一般有两个方法:

1、addPathPatterns配置拦截的api路径,所有符合路径的api请求都会进入到TokenInterceptor的拦截器中。

2、excludePathPatterns方法设置那些路径不需要进入拦截器。

开始addPathPatterns配置所有api的路径都拦截.addPathPatterns("**/api/**");发现不生效,改成了拦截所有api请求即.addPathPatterns("/**")后进去拦截器TokenInterceptor没问题了。

但是不拦截的方法不生效了。excludePathPatterns加上整个应用的server.servlet.context-path=/api变成了.excludePathPatterns(contextPath + READERS_BASE_PATH + "/auth/**");不生效,拦截代码如下:

@RestController
@RequestMapping(READERS_BASE_PATH + "/auth")
public class AuthController {
}
@Configuration
public class AppConfig implements WebMvcConfigurer {
    private TokenInterceptor tokenInterceptor;

    @Value("${server.servlet.context-path}")
    private String contextPath;

    public AppConfig(TokenInterceptor tokenInterceptor) {
        this.tokenInterceptor = tokenInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        System.out.println("addInterceptors tokenInterceptor = " + tokenInterceptor + " | registry = " + registry + " | contextPath = " + contextPath);
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**") // 拦截所有以api请求
                // 应该直接从controller中开始配置
                .excludePathPatterns(READERS_BASE_PATH + "/auth/**"); // 不拦截登录相关接口
    }

原因

正确的excludePathPatterns应该是不包含统一配置的server.servlet.context-path的,而是直接从Controller开始配置路径即可。

所以.excludePathPatterns(READERS_BASE_PATH + "/auth/**");就对应不拦截所有AuthController的请求。

解决

1、addPathPatterns通过/**拦截所有请求。

2、excludePathPatterns通过Controller来拦截具体的哪个Controller不拦截,一般指向登录注册相关的Controller即可。