標(biāo)題 | 框架 | version |
---|---|---|
1 | springboot | 1.5.9.release |
2 | springCloud | 1.2.4.release |
3 | eureka | 1.6.2 |
4 | feign | 9.5.0 |
前言
使用場景:由于我們項(xiàng)目使用的是微服務(wù)框架,各個服務(wù)之間的調(diào)用,使用的是feign調(diào)用,我們項(xiàng)目調(diào)用各個模塊直接調(diào)用,如果涉及到跨服務(wù)調(diào)用的話,開始發(fā)現(xiàn)從request里面的什么東西都獲取不到,登錄的request的session肯定是空的,但是數(shù)據(jù)調(diào)用能帶過來沒有什么問題。我們增加了各個服務(wù)的攔截器之后,需要從request獲取當(dāng)前請求的用戶session。這個肯定就不行了。我們就開始尋找解決方案,最后通過踩坑終于解決session失效的問題了(解決方案如下)。
1.解決辦法:
使用feign調(diào)用的時候通過使用requestInterceptor攔截器對請求進(jìn)行攔截,代碼如下:
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);
}
}
//下面注釋掉的代碼,如果你放開,默認(rèn)是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());
}*/
}
}
注意:下面注釋掉的代碼,如果你放開,默認(rèn)是post請求(如果你的接口是get請求放開了此代碼,回報錯:405不支持post請求。(踩的坑);這個攔截器配置加到什么位置呢?設(shè)計到模塊調(diào)用的服務(wù)都需要加一個這個配置。
yml配置:
hystrix:
command:
default:
execution:
timeout:
enabled: false
isolation:
strategy: SEMAPHORE
備注:
如果使用過程中遇到問題請留言,如果有什么不對的請高手們指正謝謝。