zoukankan      html  css  js  c++  java
  • 远程调用丢失请求头与定义RequestInterceptor

    feign远程调用的请求头中没有含有JSESSIONIDcookie,所以也就不能得到服务端的session数据,cart认为没登录,获取不了用户信息

     我们追踪远程调用的源码,可以在SynchronousMethodHandler.targetRequest()方法中看到他会遍历容器中的RequestInterceptor进行封装

    Request targetRequest(RequestTemplate template) {
    for (RequestInterceptor interceptor : requestInterceptors) {
    interceptor.apply(template);
    }
    return target.apply(template);
    }

    根据追踪源码,我们可以知道我们可以通过给容器中注入RequestInterceptor,从而给远程调用转发时带上cookie

    但是在feign的调用过程中,会使用容器中的RequestInterceptor对RequestTemplate进行处理,因此我们可以通过向容器中导入定制的RequestInterceptor为请求加上cookie。

    public class GuliFeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor() {
    return new RequestInterceptor() {
    @Override
    public void apply(RequestTemplate template) {
    //1. 使用RequestContextHolder拿到老请求的请求数据
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    if (requestAttributes != null) {
    HttpServletRequest request = requestAttributes.getRequest();
    if (request != null) {
    //2. 将老请求得到cookie信息放到feign请求上
    String cookie = request.getHeader("Cookie");
    template.header("Cookie", cookie);
    }
    }
    }
    };
    }
    }

    注意:上面在封装cookie的时候要拿到原来请求的cookie,设置到新的请求中

    RequestContextHolder为SpingMVC中共享request数据的上下文,底层由ThreadLocal实现,也就是说该请求只对当前访问线程有效,如果new了新线程就找不到原来request了

  • 相关阅读:
    第3课 线性分类器损失函数与最优化
    李飞飞机器视觉课程笔记:第2课 K最近邻与线性分类器
    周志华《机器学习》第二章学习笔记
    通过anaconda安装tensorflow
    周志华《机器学习》第一章学习笔记 奥卡姆剃刀原理、没有免费的午餐定理(NFL)、回归模型
    DPM目标检测模型
    损失函数的理解
    mini-batch的理解
    前向传播、后向传播
    SVM(支持向量机)的理解
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14582819.html
Copyright © 2011-2022 走看看