springcloud fegin獲取request header解決方案
假設現在有A服務,B服務,外部使用RESTApi請求呼叫A服務,在請求頭上有token欄位,A服務使用完後,B服務也要使用,如何才能把token也轉發到B服務呢?這裡可以使用Feign的RequestInterceptor,但是直接使用一般情況下HttpServletRequest上下文物件是為空的,這裡要怎麼處理,請看下文。
演示
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服務上即可
相關文章
- Feign 呼叫丟失Header的解決方案Header
- request 獲取不到 CookieCookie
- HttpServletRequest獲取header引數 signHTTPServletHeader
- SpringCloud BeanCurrentlyInCreationException 異常解決方案SpringGCCloudBeanException
- SpringCloud 分散式事務解決方案SpringGCCloud分散式
- Laravel request 獲取路由引數Laravel路由
- Python如何獲取request response bodyPython
- SpringCloud Fegin結合Ribbon實現負載均衡SpringGCCloud負載
- 【轉】 android獲取裝置唯一標識完美解決方案Android
- 【SpringCloud技術專題】「原生態Fegin」開啟Fegin之RPC技術的開端,你會使用原生態的Fegin嗎?(下)SpringGCCloudRPC
- 【SpringCloud技術專題】「原生態Fegin」開啟Fegin之RPC技術的開端,你會使用原生態的Fegin嗎?(中)SpringGCCloudRPC
- 【SpringCloud技術專題】「原生態Fegin」開啟Fegin之RPC技術的開端,你會使用原生態的Fegin嗎?(上)SpringGCCloudRPC
- js 裡不能使用${pageContext.request.contextPath}解決方案JSContext
- python request 獲取cookies value值的方法PythonCookie
- 微服務一站式解決方案SpringCloud微服務SpringGCCloud
- 快取穿透詳解及解決方案快取穿透
- Django透過request獲取客戶端IPDjango客戶端
- laravel symfony request獲取真實ip的坑Laravel
- invalid stream header: EFBFBDEF 問題解決Header
- 快取的三大方案以及解決方案快取
- java web 通過request獲取客戶端IPJavaWeb客戶端
- 美創金融脫敏解決方案,榮獲“信創安全優秀解決方案”
- Feign客戶端呼叫服務時丟失Header引數的解決方案客戶端Header
- SpringCloud問題解決:spring-cloud-eureka啟動出錯Cannot execute request on any known serverSpringGCCloudServer
- Redis 快取穿透、快取雪崩原理及解決方案Redis快取穿透
- request/response解決中文亂碼
- 解決gc current request等待事件GC事件
- Laravel 中 $request 獲取請求資訊 用法 總結Laravel
- DigiMobi獲香港機場VTS解決方案合同
- 快取穿透、快取擊穿、快取雪崩概念及解決方案快取穿透
- 【Redis】快取穿透,快取擊穿,快取雪崩及解決方案Redis快取穿透
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透
- IE瀏覽器非同步請求無法獲取最新資料的解決方案瀏覽器非同步
- uni-app:獲取當前經緯度解決方案+如何佈置全域性元件APP元件
- 快取三大問題及解決方案快取
- 快取常見問題及解決方案快取
- $request 請求方法 獲取 API 的當前使用者API
- Jmeter系列(31)- 獲取並使用 JDBC Request 返回的資料JMeterJDBC