springcloud fegin获取request header解决方案

原创 2018年04月17日 16:28:24

假设现在有A服务,B服务,外部使用RESTApi请求调用A服务,在请求头上有token字段,A服务使用完后,B服务也要使用,如何才能把token也转发到B服务呢?这里可以使用Feign的RequestInterceptor,但是直接使用一般情况下HttpServletRequest上下文对象是为空的,这里要怎么处理,请看下文。

springcloud

演示

A服务FeginInterceptor

@Configuration
public class FeginInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        Map<String,String> headers = getHeaders(getHttpServletRequest());
        for(String headerName : headers.keySet()){
            requestTemplate.header(headerName, getHeaders(getHttpServletRequest()).get(headerName));
        }
    }

    private HttpServletRequest getHttpServletRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private Map<String, String> getHeaders(HttpServletRequest request) {
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    }

}

重点配置
A服务配置bootstrap.yml

hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE

A服务build.gradle

buildscript {
    ext{
        springBootVersion = '1.5.9.RELEASE'
    }

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "io.spring.gradle:dependency-management-plugin:0.5.6.RELEASE"
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: "io.spring.dependency-management"
version = '0.0.1-SNAPSHOT'
group 'com.dounine.test'

sourceCompatibility = 1.8

repositories {
    mavenLocal()
    mavenCentral()
}

ext {
    springCloudVersion = 'Dalston.SR2'
}

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile('org.springframework.cloud:spring-cloud-starter-eureka')
    compile('org.springframework.cloud:spring-cloud-starter-feign')
    compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.8.13'
    compile('org.springframework.boot:spring-boot-starter-data-redis')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

B服务Action

    @Autowired
    private HttpServletRequest servletRequest;

    public String test() {
        return servletRequest.getHeader("token");
    }

B服务问题

如若B服务也要将header请求转发到其它服务,将A服务的配置也应用到B服务上即可

版权声明:多一份转载,多一份环保 https://blog.csdn.net/dounine/article/details/79976747

springBoot配置文件application.properties

springBoot配置文件application.properties
  • yuchao2015
  • yuchao2015
  • 2016-09-19 19:02:56
  • 17466

java.lang.IllegalArgumentException: Request header is too large的解决方法

connectionTimeout="20000"                redirectPort="8443" maxHttpHeaderSize="65536" maxPostSize=...
  • AinUser
  • AinUser
  • 2017-09-14 11:24:19
  • 2910

SpringBoot 报java.lang.IllegalArgumentException: Request header is too large......异常

在SpringBoot框架中,服务间相互调用,可能会报以下的错误 java.lang.IllegalArgumentException: Request header is too large ...
  • wd2014610
  • wd2014610
  • 2018-03-21 15:45:49
  • 147

spring boot 和 nginx的上传资源大小配置(nginx 413 request entity too large)

spring boot #file upload multipart.maxFileSize=50Mb multipart.maxRequestSize=50Mb nginx
  • kkgbn
  • kkgbn
  • 2016-12-11 04:08:51
  • 1757

java.lang.IllegalArgumentException: Request header is too large

get请求报错原因:请求头超过了限值,get请求限制了大小一、get和post的区别1.get是从服务器上获取数据   post是向服务器发送数据 2.get是把参数数据提交到地址中,当然地址栏都可以...
  • siyi1219
  • siyi1219
  • 2018-03-08 11:21:47
  • 19

http post request header is too large 问题

post请求,本身请求参数无大小限制,但是一般的服务器像tomcat都有默认大小,出现上述问题就是传输的参数超过了默认大小, 处理办法:在server.xml中   处加上maxHttpHeade...
  • chenjn1234
  • chenjn1234
  • 2016-06-20 16:53:58
  • 13602

《Springboot开发问题纪要》java.lang.IllegalArgumentException: Request header is too large

问题日志:java.lang.IllegalArgumentException: Request header is too large java.lang.IllegalArgumentExcept...
  • universsky2015
  • universsky2015
  • 2017-09-13 14:27:36
  • 781

关于feign调用传递header的解决方法

我现在用feign来实现内部系统的方法调用,但有一个问题,使用国际化的时候语言传递不了,因为在header上。 下面贴一下解决方案:@Bean public RequestIntercept...
  • u014519194
  • u014519194
  • 2017-08-14 14:07:02
  • 4837

Fegin 多媒体上传调用

multipart/form-dataSpring MVC中关于关于Content-Type类型信息的使用 首先我们来看看RequestMapping中的Class定义: [html] vie...
  • chenjianandiyi
  • chenjianandiyi
  • 2017-10-09 18:51:55
  • 806

全栈开发——动手打造属于自己的直播间(Vue+SpringBoot+Nginx)

前言大学的学习时光临近尾声,感叹时光匆匆,三年一晃而过。同学们都忙着找工作,我也在这里抛一份简历吧,欢迎各位老板和猎手诚邀。我们进入正题。直播行业是当前火热的行业,谁都想从中分得一杯羹,直播养活了一大...
  • hushangjie
  • hushangjie
  • 2017-06-23 13:47:10
  • 8539
收藏助手
不良信息举报
您举报文章:springcloud fegin获取request header解决方案
举报原因:
原因补充:

(最多只允许输入30个字)