springboot使用feign调用session传递失效解决方案

标题 框架 version
1 springboot 1.5.9.release
2 springCloud 1.2.4.release
3 eureka 1.6.2
4 feign 9.5.0

前言

使用场景:由于我们项目使用的是微服务框架,各个服务之间的调用,使用的是feign调用,我们项目调用各个模块直接调用,如果涉及到跨服务调用的话,开始发现从request里面的什么东西都获取不到,登录的request的session肯定是空的,但是数据调用能带过来没有什么问题。我们增加了各个服务的拦截器之后,需要从request获取当前请求的用户session。这个肯定就不行了。我们就开始寻找解决方案,最后通过踩坑终于解决session失效的问题了(解决方案如下)。

1.解决办法:

使用feign调用的时候通过使用requestInterceptor拦截器对请求进行拦截,代码如下:

package com.xxx.system.feign;


import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {
      @Override
      public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
          while (headerNames.hasMoreElements()) {
            String name = headerNames.nextElement();
            String values = request.getHeader(name);
            requestTemplate.header(name, values);
          }
        }
        //下面注释掉的代码,如果你放开,默认是post请求(如果你的接口是get请求放开了此代码,回报错:405不支持post请求。)
        /*Enumeration<String> bodyNames = request.getParameterNames();
          StringBuffer body =new StringBuffer();
          if (bodyNames != null) {
              while (bodyNames.hasMoreElements()) {
                String name = bodyNames.nextElement();
                String values = request.getParameter(name);
                body.append(name).append("=").append(values).append("&");
              }
          }
         if(body.length()!=0) {
            body.deleteCharAt(body.length()-1);
            requestTemplate.body(body.toString());
            log.info("feign interceptor body:{}",body.toString());
        }*/
      }
}

注意:下面注释掉的代码,如果你放开,默认是post请求(如果你的接口是get请求放开了此代码,回报错:405不支持post请求。(踩的坑);这个拦截器配置加到什么位置呢?设计到模块调用的服务都需要加一个这个配置。

yml配置:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false
        isolation:
          strategy: SEMAPHORE 

备注:

如果使用过程中遇到问题请留言,如果有什么不对的请高手们指正谢谢。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •  通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌...
    Chandler_珏瑜阅读 214,364评论 15 140
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 4,650评论 0 0
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,584评论 11 349
  • 利用HTTP协议向服务器传参的几种途径、响应、Cookie、Session、类视图、中间件 注意: 1>Dja...
    Cestine阅读 5,231评论 0 2
  • 2018已然悄悄溜走,2019新的一年既已匆匆到来。 回首过去,脑袋里是空白的,应是没有做后悔的事吧,唯一遗憾就是...
    LUCKFAIRY_9c19阅读 2,241评论 0 0

友情链接更多精彩内容