在自定义拦截器时 发现使用@Value注入属性失败,原因时拦截器对象并没有交给容器,可以在 WebMvcConfig 中将拦截器对象注入到容器中
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 将自定义拦截器对象叫给spring管理
*/
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 将 AuthenticationInterceptor 拦截器添加到拦截器链中
registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
将对象放入容器之后发现属性不能实时更新@RefreshScope 不生效
-
@RefreshScope注解用于标识在服务配置中心配置更新时,当前 Bean 需要重新注入以获取最新的配置值。但是在这段代码中,@RefreshScope注解标注在拦截器类上,并不会使拦截器实例重新注入。
-
通常情况下,拦截器是在应用程序启动时由 Spring Framework 实例化和初始化的,而不是在请求处理过程中动态创建的。因此,如果要使拦截器的属性值能够在应用程序运行期间动态更新,可以通过将该属性的值从 Spring 的 Environment 或 ConfigurableEnvironment 中获取,以确保始终使用最新的配置值。
-
例如,在AuthenticationInterceptor类中,可以注入Environment或ConfigurableEnvironment的实例,并在需要使用timeout_exit属性的地方使用它来获取最新的配置值,而不是直接使用属性本身
注入 Environment 对象
@Autowired
private Environment env;
获取值文章来源:https://www.toymoban.com/news/detail-440760.html
env.getProperty("screen.timeout-exit", Boolean.class, false
完整代码文章来源地址https://www.toymoban.com/news/detail-440760.html
@Component
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
private Environment env;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestUri = request.getRequestURI();
// 如果请求路径为 /screen-api/assetSituation/test,直接放行
if (requestUri.equals("/screen-api/assetSituation/test")) {
return true;
}
// 获取请求头中的 HKTOKEN 值
String abc = request.getHeader("123");
if (hkToken != null && !hkToken.isEmpty()) {
// 如果 HKTOKEN 值不为空,则将其存储到 request 对象中
request.setAttribute("123", abc );
return true;
} else {
if (env.getProperty("screen.timeout-exit", Boolean.class, false)) {
response.setContentType("application/json;charset=utf-8");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write(JSONObject.toJSONString(Result.error(ResultCode.UN_LOGIN.getCode(), "登录已超时,请重新登录")));
return false;
} else {
return true;
}
}
}
}
到了这里,关于springboot在自定义拦截器中使用@Value获取值失败及@RefreshScope 不生效问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!