• Feign远程调用丢失请求头问题


    1、feign远程调用导致请求头丢失问题

    截图

    如何解决?

    加上feign远程调用的请求拦截器

    截图

    /**
     * @author houChen
     * @date 2022/2/3 17:20
     * @Description:  谷粒商城feign请求的相关配置
     */
    @Configuration
    public class GuliFeignConfig {
    
        @Bean("requestInterceptor")
        public RequestInterceptor requestInterceptor(){
            return new RequestInterceptor(){
    
                @Override
                public void apply(RequestTemplate template) {
                    //1、RequestContextHolder拿到刚进来的请求
                    ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
                    HttpServletRequest request = requestAttributes.getRequest(); //老请求
                    //2、同步请求头数据 cookie
                    String cookie = request.getHeader("cookie");
                    template.header("cookie",cookie);
                }
            };
        }
    }

    2、异步Feign调用丢失请求头问题

    在一个请求的执行过程中,如果有一个新的异步请求出来执行别的任务,那么在该新的请求中是拿不到老的请求的

    上下文环境的。

    截图

    可以在新的上下文环境中将老的上下文环境赋值过去

    @Override
    public OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {
        OrderConfirmVo orderConfirmVo = new OrderConfirmVo();
        MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get();
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
            //解决异步feign请求丢失请求头问题
            RequestContextHolder.setRequestAttributes(requestAttributes);
            //1、远程查询所有的收货地址列表
            List<MemberAddressVo> address = memberFeignService.getAddress(memberRespVo.getId());
            orderConfirmVo.setAddress(address);
        }, executor);
    
        CompletableFuture<Void> completableFuture2 = CompletableFuture.runAsync(() -> {
            RequestContextHolder.setRequestAttributes(requestAttributes);
            //2、远程查询购物车所有选中的购物项
            List<OrderItemVo> currentUserCartItems = cartFeignService.getCurrentUserCartItems();
            orderConfirmVo.setItems(currentUserCartItems);
        }, executor);
    
        CompletableFuture.allOf(completableFuture1,completableFuture2).get();
        //3、查询用户积分
        Integer integration = memberRespVo.getIntegration();
        orderConfirmVo.setIntegration(integration);
        //4、其他数据自动计算
    
        //5、todo 防订单重复提交令牌
        return orderConfirmVo;
    }
  • 相关阅读:
    HTML5的页面资源预加载技术(Link prefetch)加速页面加载
    正则表达式入门教程
    SQL 查询分析器操作(修改、添加、删除)表及字段等
    linux终端相关概念解释及描述
    linux系统编程--守护进程,会话,进程组,终端
    linux系统编程--信号
    linux系统编程--进程间通信
    linux系统编程--进程
    Python GUI编程(Tkinter)(一)
    C++中时间转换
  • 原文地址:https://www.cnblogs.com/houchen/p/15863663.html
Copyright © 2020-2023  润新知