Java程序员

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

2019-01-22  本文已影响118人  挑战者666888
标题 框架 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 

备注:

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

上一篇下一篇

猜你喜欢

热点阅读