springboot在自定义拦截器中使用@Value获取值失败及@RefreshScope 不生效问题

在自定义拦截器时 发现使用@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;

获取值

env.getProperty("screen.timeout-exit", Boolean.class, false

完整代码

@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;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值