• feign统一加入token,同时定时任务中feign 调用没有token(定时任务的token校验是放开的)冲突


    feign调用时统一获取token,加入header时报错
    报错如下
    no thread-bound request found: are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? if you are actually …

    1.如何给所有的feign加入token
    @Component
    public class TokenInterceptor implements RequestInterceptor {
    private final HttpServletRequest request;

    @Autowired
    public TokenInterceptor(HttpServletRequest request) {
        this.request = request;
    }
    @Override
    public void apply(RequestTemplate template) {
        String token = request.getHeader("X-Access-Token"); // 从原始请求头中获取 Token
        template.header("Authorization", "Bearer " + token); // 将 Token 添加到 Feign 请求头中
        template.header("X-Access-Token",   token); // 将 Token 添加到 Feign 请求头中
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    }

    原理:TokenInterceptor 实现了 RequestInterceptor 接口,该接口是 Feign 提供的拦截器接口。当你将 TokenInterceptor 注册为 Feign 的拦截器后,它会在每次 Feign 调用时被调用。

    Feign 在发送请求之前会执行拦截器链,包括注册的所有拦截器。在拦截器链中,每个拦截器都可以对请求进行修改或者添加额外的处理逻辑。

    RequestInterceptor 接口定义了一个 apply 方法,该方法在发送请求之前被调用,可以通过 RequestTemplate 对象来修改请求的相关信息,比如请求头、请求参数等。

    因此,当你注册了 TokenInterceptor 作为 Feign 的拦截器之后,在每次 Feign 调用发起之前,apply 方法都会被调用,你可以在其中添加你的 Token 处理逻辑,将 Token 添加到请求头中,以实现在 Feign 调用中自动携带 Token。

    需要注意的是,为了让 Feign 客户端生效,你需要将 TokenInterceptor 注册为一个 Bean,并将其加入到 Spring 容器中。具体的方式取决于你使用的 Spring Boot 版本和配置方式。

    总结来说,TokenInterceptor 可以拦截 Feign 调用是因为它实现了 RequestInterceptor 接口,并且在拦截器链中被调用,可以对请求进行修改和添加额外处理逻辑。

    如果在没有实际的 web 请求的情况下调用 Feign 接口,将导致无法获取到 HttpServletRequest 对象,从而引发异常。
    no thread-bound request found: are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? if you are actually …
    为了避免这个问题,你可以将 HttpServletRequest 对象封装为一个 ThreadLocal,如下处理

    解决:

    public class TokenHolder {
        private static final ThreadLocal<String> tokenHolder = new ThreadLocal<>();
        private static Boolean TokenValidationFlag=true;
    
        public static Boolean getTokenValidationFlag() {
            return TokenValidationFlag;
        }
    
        public static void setTokenValidationFlag(Boolean tokenValidationFlag) {
            TokenValidationFlag = tokenValidationFlag;
        }
    
        public static void setToken(String token) {
            tokenHolder.set(token);
        }
    
        public static void removeToken() {
            tokenHolder.remove();
        }
    
        public static String getToken() {
            return tokenHolder.get();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    @Component
    public class TokenInterceptor implements RequestInterceptor {
        private final HttpServletRequest request;
    
        @Autowired
        public TokenInterceptor(HttpServletRequest request) {
            this.request = request;
        }
    
        @Override
        public void apply(RequestTemplate template) {
    
            boolean validateToken = TokenHolder.getTokenValidationFlag();
            if (validateToken) {
                String token = request.getHeader("X-Access-Token"); // 从原始请求头中获取 Token
                template.header("Authorization", "Bearer " + token); // 将 Token 添加到 Feign 请求头中
                template.header("X-Access-Token", token); // 将 Token 添加到 Feign 请求头中
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    定时任务处理

        @Scheduled(fixedDelay =30 * 60 * 1000)
    //    @PostConstruct
        public void initGoods(){
            TokenHolder.setTokenValidationFlag(false);
            Result<List<SysApplicationPermissionDto>> applicationAndPermissions = sysUserCenterApi.getApplicationAndPermissions();
            TokenHolder.setTokenValidationFlag(true);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    java计算机毕业设计基于springboot+vue+elementUI的旅游网站(源码+数据库+Lw文档)
    Vue响应式数据的判断
    Leetcode594:最长和谐子序列
    Node.js --- 前端高薪之路绕不过去的坎
    Go-Zero定义API实战:探索API语法规范与最佳实践(五)
    设置按键中断,按键1按下,LED亮,再按一次,灭,按键2按下,蜂鸣器响。再按一次,不响,按键3按下,风扇转,再按一次,风扇停。
    ctfshow-web11(session绕过)
    LC滤波器的原理与应用解析 | 百能云芯
    推箱子游戏设计与实现(Java+swing+JAWT)
    Java项目:JSP酒店管理系统
  • 原文地址:https://blog.csdn.net/weixin_43866043/article/details/130892215