大家應該都知道在做Zuul網關過濾的時候,如果不在網關過濾時轉發頭信息,經過網關時頭信息就會丟失。
但我用 addZuulRequestHeader轉發頭信息時,卻不起作用,在子服務的controller取不到頭信息的內容,
是因為頭信息的Authorization這個單詞的問題
敏感頭信息Authorization,Cookie,Set-Cookie默認是不轉發的,也就獲取不到
在配置文件里設置zuul.sensitiveHeaders為空,或者使用別的單詞如Authorization1,就可以獲取到了。
我的代碼如下:
1、引入依賴
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 5 </dependency> 6 <dependency> 7 <groupId>org.springframework.cloud</groupId> 8 <artifactId>spring-cloud-starter-netflix-zuul</artifactId> 9 </dependency> 10 </dependencies>
2、zuul配置
1 zuul: 2 routes: 3 xxxx-base: 4 path: /base/** 5 serviceId: xxxx-base
3、過濾器
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class WebFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { //得到request上下文 RequestContext currentContext = RequestContext.getCurrentContext(); //得到request域 HttpServletRequest request = currentContext.getRequest(); //得到頭信息 String header = request.getHeader("Authorization"); //判斷是否有頭信息 if(header != null && !"".equals(header)){ //把頭信息繼續向下傳 currentContext.addZuulRequestHeader("Authorization", header); } return null; } }
4、在xxxx-user服務的controller里面測試能否獲取到
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.List; @RestController @CrossOrigin @RequestMapping("/label") public class LabelController { @Autowired private LabelService labelService; @Autowired private HttpServletRequest request; @GetMapping public Result findAll(){ //獲取頭 String header= request.getHeader("Authorization"); System.out.println("++++++++++++++:"+header); return new Result(true, StatusCode.OK,"查詢成功",labelService.findAll()); } }
5、結果
1)、在過濾器里面能拿到,並且打印有值;
2)、在controller里面測試獲取不到,打印為null。
最終在網上看到一個兄弟的博客,才找出問題所在,
萬分感謝!貼上原文地址 https://ask.csdn.net/questions/748656?sort=id