首页 > 其他分享 >实现RequestInterceptor接口的两个拦截器,其中一个apply方法没有执行

实现RequestInterceptor接口的两个拦截器,其中一个apply方法没有执行

时间:2024-11-27 11:11:17浏览次数:4  
标签:拦截器 requestTemplate private token tenantAccessToken apply RequestInterceptor pub

已经在config类中,对两个拦截器进行定义了。但是在打断点的时候,TokenInterceptor中重写的apply()方法没有被执行。

@Configuration
@Slf4j
public class FeginConfig {

    @Bean
    @Order(1)
    public TokenInterceptor tokenInterceptor(){
        log.info("TokenInterceptor bean created");
        return new TokenInterceptor();
    }

    @Bean
    @Order(2)
    public MessageInterceptor messageInterceptor(){
        log.info("MessageInterceptor bean created");
        return new MessageInterceptor();
    }

}
未执行apply方法的拦截器。
@Slf4j
public class TokenInterceptor implements RequestInterceptor {

    private String token;

    /**
     * 记录上次更新令牌时间
     */
    private long lastUpdateTime;

    private String tokenExpireTime;

    @Autowired
    private FeiShuApiService feiShuApiService;

    @Autowired
    public TenantAccessToken tenantAccessToken;

    @Value("${app.app_id}")
    private String appId;

    @Value("${app.app_secret}")
    private String appSecret;

    @Value("${app.token_url}")
    private String tokenUrl;

    @PostConstruct
    public void init(){
        // 初始化时获取一次 access_token
        refreshAccessToken();
    }

    /**
     * 该重新接口,每次请求前都会被调用一次,用于检查token
     * @param requestTemplate
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        log.info("TokenInterceptor apply method called");
        //第一次获取token,token最新更新时间和过期时间为null,跳过该方法
        if (lastUpdateTime != 0 || tokenExpireTime != null){
            if ((System.currentTimeMillis() - lastUpdateTime) >= Long.parseLong(tokenExpireTime) * 1000) {
                TenantAccessToken tenantAccessToken = this.refreshAccessToken();
                token = tenantAccessToken.getTenantAccessToken();
                log.info("token:" + token);
            }
            requestTemplate.header("Content-Type","application/json; charset=utf-8");
            requestTemplate.header("Authorization", "Bearer " + token);
        }
    }

    //获取token
    private TenantAccessToken refreshAccessToken() {
        // 获取新的 access_token
        Map<String, String> tokenResponse = feiShuApiService.getTenantAccessToken(appId,appSecret);
        TenantAccessToken tenantAccessToken = new TenantAccessToken();
        tenantAccessToken.setCode(tokenResponse.get("code"));
        tenantAccessToken.setExpire(tokenResponse.get("expire"));
        tenantAccessToken.setTenantAccessToken(tokenResponse.get("tenant_access_token"));
        tenantAccessToken.setMsg(tokenResponse.get("msg"));
        this.tokenExpireTime = tokenResponse.get("expire");
        this.token = tokenResponse.get("tenant_access_token");
        this.lastUpdateTime = System.currentTimeMillis();
        return tenantAccessToken;
    }
}

正常执行apply方法的拦截器

@Order(2)
public class MessageInterceptor implements RequestInterceptor {

    @Autowired
    public TenantAccessToken tenantAccessToken;

    @Override
    public void apply(RequestTemplate requestTemplate) {
        if (requestTemplate.url().contains("/open-apis/im/v1/messages")){
            requestTemplate.header("receive_id_type","user_id");
            requestTemplate.header("content-type","application/json; charset=utf-8");
            requestTemplate.header("Authorization", "Bearer " + tenantAccessToken.getTenantAccessToken() );
        }
    }
}

  

原因:

  通过@Autowired注解注入的 feiShuApiService 类使用了 @FeignClient 注解,以及 @Value 注解,这些会导致不执行 apply方法。具体原因不明。

 

解决办法:
  删除以上注入的类和属性,寻找其他方法代替。

 

标签:拦截器,requestTemplate,private,token,tenantAccessToken,apply,RequestInterceptor,pub
From: https://www.cnblogs.com/yanhongwen/p/18571982

相关文章

  • gateway拦截器获取请求参数
    packagecom.dp.config;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage;importorg.s......
  • JavaWeb合集17-拦截器(Interceptor)和过滤器(Filter)
    十七、拦截器和过滤器在JavaWeb开发中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求处理前后执行某些操作的机制。虽然它们的功能相似,但在实现方式、使用场景和灵活性方面有一些重要的区别。1、拦截器和过滤器的区别及选择1.1拦截器定义:拦截器是Spring框架提供......
  • 改变函数调用上下文:apply与call方法详解及实例
    目录改变函数调用上下文:apply与call方法详解及实例一、什么是apply方法?1、apply语法2、apply示例二、什么是call方法?1、call语法 2、call示例三、apply和call的共同与差异1、apply和call的共同点2、apply和call的差异四、apply和call的其他实......
  • springmv的过滤器和拦截器的区别是什么
    一个请求进来的时候,先交给web服务器提供的过滤器,例如springboot项目,提供的服务器也就是内置的tomcat,过滤器处理完成以后,然后会来到servlet,有一个dispatcherServlet会调用拦截器,再由dispatcherServlet分发给对应的Controller,处理完请求后,会原路返回,再回到拦截器,再回到过滤器,最终响......
  • Spingboot 定时任务与过滤器,拦截器
     在boot环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用Spring自带的定时任务处理器@Scheduled注解,另一种就是使用第三方框架Quartz,SpringBoot源自Spring+SpringMVC,因此天然具备这两个Spring中的定时任务实现策略,当然也支持Quartz1.定时任务@Sched......
  • 过滤器和拦截器的区别是什么?
    首先,过滤器和拦截器都可以在请求的过程中插入一手,也可以进行拦腰截断。请求过程:当一个请求进来,先交给Web服务器提供的过滤器,来到Servlet,同时会有一个叫做DispatcherServlet的Servlet进行执行,在DispatcherServlet中就会调用我们的拦截器,再由DispatcherServlet分发给对应的Contro......
  • 拦截器实现拦截到人员的id
    WebConfig.WebConfig(配置拦截器)@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@BeanpublicCrewInterceptorcrewInterceptor(){returnnewCrewInterceptor();}/*@AutowiredprivateCrewInterceptorcrewInterc......
  • MyBatis拦截器
    一.JDBC的执行流程(面试题一)JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。原始的JDBC操作数据库主要有以下几个步骤:1.注册驱动使用Class.f......
  • 【Mybatis】Mybatis拦截器+注解,实现敏感数据自动加解密
    一:背景     今天,公司新要求对数据库的敏感数据进行加密,对手机号、身份证号、姓名等一些敏感数据进行加密处理,要求:    1.通过程序实现数据加密解密(快速便捷,尽量减少对原先代码的修改)    2.可以通过sql查询对数据进行解密(通过密钥直接对数据库......
  • 9.23scala中的apply和equal改写
    Scala对象的创建(1)new:使用new关键字创建类的对象(2)伴生对象:使用object关键字创建一个单例对象(3)apply:apply是一个方法,需要在伴生对象中实现这个方法 能够不使用new关键字来创建对象//创建类使用classclassStu(varname:String,vargender:String,varID:String){def......