SpringBoot-3 拦截器注入配置
如果拦截器加载的时间点在Spring的上下文初始化之前,导致注入的值为null,您可以尝试以下两种解决方法:
- 使用
@PostConstruct
注解:
在拦截器中使用@PostConstruct
注解标记一个初始化方法,在该方法中手动获取配置值,并进行相应的处理。这样可以确保在拦截器初始化完成后,配置值已经被正确加载。例如:
@Component
public class TokenInterceptor implements HandlerInterceptor {
@Value("${authorize.token}")
private String expectedToken;
private String cachedExpectedToken;
@PostConstruct
public void init() {
// 在初始化方法中获取配置值并缓存
cachedExpectedToken = expectedToken;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 使用缓存的配置值进行处理
String token = request.getHeader("Authorization");
System.out.println("从header中获取到token:" + token);
System.out.println("expectedToken:" + cachedExpectedToken);
if (token != null && token.equals(cachedExpectedToken)) {
return true;
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("无权限访问");
return false;
}
}
// 省略其他方法
}
- 自定义属性读取类:
创建一个自定义的属性读取类,在该类中手动读取配置文件中的属性值,并在拦截器中使用该属性读取类获取配置值。这样可以确保配置值在拦截器初始化之前已经被正确加载。例如:
@Component
public class TokenProperties {
@Value("${authorize.token}")
private String expectedToken;
public String getExpectedToken() {
return expectedToken;
}
}
@Component
public class TokenInterceptor implements HandlerInterceptor {
private final TokenProperties tokenProperties;
@Autowired
public TokenInterceptor(TokenProperties tokenProperties) {
this.tokenProperties = tokenProperties;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 使用属性读取类获取配置值进行处理
String token = request.getHeader("Authorization");
System.out.println("从header中获取到token:" + token);
System.out.println("expectedToken:" + tokenProperties.getExpectedToken());
if (token != null && token.equals(tokenProperties.getExpectedToken())) {
return true;
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("无权限访问");
return false;
}
}
// 省略其他方法
}
本博客是个人工作中记录,更深层次的问题可以提供有偿技术支持。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。