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

这篇具有很好参考价值的文章主要介绍了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

完整代码文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

    ps:最近在参与3100保卫战,战况很激烈,刚刚打完仗,来更新一下之前写了一半的博客。 该篇针对日常写查询的时候,那些动态条件sql 做个简单的封装,自动生成(抛砖引玉,搞个小玩具,不喜勿喷)。 来看看我们平时写那些查询,基本上都要写的一些动态sql:   一个字段

    2024年02月12日
    浏览(49)
  • 【SpringBoot】拦截器(Interceptor)的使用

            拦截器(Interceptor)是一种特殊的组件,它可以在请求处理的过程中对请求和响应进行拦截和处理。拦截器可以在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定的操作。拦截器的主要目的是在不修改原有代码的情况下,实现对请求和响

    2024年02月04日
    浏览(47)
  • SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交

    SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数): SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)_redis防刷_霸道流氓气质的博客-CSDN博客 以下接口幂等性的实现方式与上面博客类似,可参考。 什么是幂等性? 幂等

    2024年02月15日
    浏览(55)
  • Springboot中使用拦截器、过滤器、监听器

    Javaweb三大组件:servlet、Filter(过滤器)、 Listener(监听器) SpringBoot特有组件:Interceptor(拦截器) 过滤器、拦截器、监听器、AOP(后续文章介绍)、全局异常处理器(后续文章介绍)是搭建系统框架时,经常用到的部分,全局异常处理器的作用很明显,就是处理接口执行

    2024年02月03日
    浏览(43)
  • 自定义注解与拦截器实现不规范sql拦截(拦截器实现篇)

    最近考虑myBatis中sql语句使用规范的问题,如果漏下条件或者写一些不规范语句会对程序性能造成很大影响。最好的方法就是利用代码进行限制,通过拦截器进行sql格式的判断在自测环节就能找到问题。写了个简单情景下的demo,并通过idea插件来将myBatis的mapper方法都打上拦截器

    2024年01月22日
    浏览(45)
  • SpringBoot 统计API接口用时该使用过滤器还是拦截器?

    统计请求的处理时间(用时)既可以使用 Servlet 过滤器(Filter) ,也可以使用 Spring 拦截器(Interceptor) 。两者都可以在请求处理前后插入自定义逻辑,从而实现对请求响应时间的统计。 如果你需要在更底层、与框架无关的地方记录所有请求(包括静态资源请求)的处理时间

    2024年01月18日
    浏览(47)
  • SpringBoot加入拦截器——登录拦截器的实现

            拦截器 Interceptor 在 Spring MVC 中的地位等同于 Servlet 规范中的过滤器 Filter,拦截的是处理器的执行,由于是全局行为,因此常用于做一些通用的功能,如请求日志打印、权限控制等。         核心原理:AOP思想 preHandle:  预先处理,在目标的controller方法执行之前,进行

    2024年02月15日
    浏览(43)
  • 自定义拦截器实现

    在 Spring MVC 框架中, 拦截器作为一种机制, 用于对请求进行拦截. 拦截器可以在请求进入处理器之前、处理器返回处理之后、视图渲染之前等各个环节进行拦截. 拦截器通常用于实现一下功能 : 鉴权和身份认证 日志记录和统计 请求参数和校验和过滤 缓存和性能优化 路径重定向

    2024年02月09日
    浏览(56)
  • 【Spring】Springboot过滤器Filter和拦截器Inteceptor详解及使用场景

    Springboot过滤器Filter和拦截器Inteceptor详解及使用场景

    2024年02月13日
    浏览(44)
  • flume自定义拦截器

    要自定义 Flume 拦截器,你需要编写一个实现 org.apache.flume.interceptor.Interceptor 接口的自定义拦截器类。以下是一个简单的示例: 在上面的示例中,我们实现了 initialize() 、 intercept() 、 intercept(ListEvent events) 、 close() 方法来定义自定义拦截器的行为。你可以根据需要在这些方法中

    2024年01月23日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包