程序员济癫 2019-02-07 01:48 采纳率: 50%
浏览 8156
已采纳

Zuul过滤器里面用addZuulRequestHeader转发没有作用

springcloud版本:Finchley SR2

1、引入依赖

                <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

2、zuul配置

zuul:
  routes:
    app-user:
      path: /user/**
      serviceId: app-user

3、过滤器

@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 {
        System.out.println("zuul过滤器...");
        //向header中添加鉴权令牌
        RequestContext requestContext = RequestContext.getCurrentContext();
        //获取header
        HttpServletRequest request = requestContext.getRequest();
        String authorization = request.getHeader("Authorization");
        if(authorization != null) {
            System.out.println("authorization: " + authorization);
            requestContext.addZuulRequestHeader("Authorization", authorization);
        }
        return null;
    }
}

4、在app-user服务的controller里面测试能否获取到

@Autowired
    private HttpServletRequest request;

    /**
     * 查询全部数据
     * @return
     */
    @RequestMapping(method= RequestMethod.GET)
    public Result findAll(){
        String header = request.getHeader("Authorization");
        System.out.println("authHeader: " + header);
        return new Result(true,StatusCode.OK,"查询成功",userService.findAll());
    }

5、结果
1)、在过滤器里面能拿到,并且打印有值;
2)、在controller里面测试获取不到,打印为null。

PS:
不知道为什么在过滤器里这个addZuulRequestHeader没起作用,折腾半天没找原因,甚至查找了一些博客,写法都一样的,就那么几步,有哪位大佬遇到过这问题的,可以给点思路吗……┭┮﹏┭┮

  • 写回答

7条回答 默认 最新

  • 程序员济癫 2019-02-07 04:46
    关注

    经过无数次测试,终于找到问题了,罪魁祸首就是Authorization这个单词,不论大写小写,都获取不到,但是改成Authorization1就能获取到,我直接换成了其它的单词如token,就OK了,还专门试了试各种单词以及大小写,发现就是Authorization这个单词的问题,不知道是敏感词汇还是怎么的,zuul转发时子服务就是拿不到。
    顺便查看了下zuul过滤器里面自带的requestContext.addZuulRequestHeader("xx")的源码,里面是这样写的:
    public void addZuulRequestHeader(String name, String value) {
    this.getZuulRequestHeaders().put(name.toLowerCase(), value);
    }
    是会自己转成小写的,所以保险起见以后header命名最好都是小写,以免引起未知的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵