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即可。