Zuul網關過濾器中轉發頭信息不起作用


大家應該都知道在做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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM