解决Cookie的写入问题(Zuul,Nginx)实在太坑了!!!

16 篇文章 1 订阅

解决Cookie写入问题

cookie里面什么信息都没有

为什么没有呢?

解决办法汇总(具体看下方)
  1. 跨域问题。允许跨域的域名不能是*,而应该是具体的。并且要允许cookie

  2. 前台代码没有允许使用cookie

  3. nginx转发时头信息没有加上域名信息,导致转发后域名变为了本地的域名

  4. Zuul转发时没有在头信息添加域名信息

  5. Zuul敏感头过滤

zuul:
  prefix: /api
  routes:
    item-service: /item/**
    search-service: /search/**
    user-service: /user/**
    auth-service: /auth/**
  add-host-header: true  #在头信息增加host信息
  sensitive-headers:   # 覆盖默认敏感头信息

6.如果都不行,重启nginx(一定要关闭完全)

taskkill /im nginx.exe /f
问题分析

我们在之前测试时,清晰的看到了响应头中,有Set-Cookie属性,为什么在这里却什么都没有?

我们之前在讲cors跨域时,讲到过跨域请求cookie生效的条件:

  • 服务的响应头中需要携带Access-Control-Allow-Credentials并且为true。
  • 响应头中的Access-Control-Allow-Origin一定不能为*,必须是指定的域名
  • 浏览器发起ajax需要指定withCredentials 为true

看看我们的服务端cors配置:

没有任何问题。

再看客户端浏览器的ajax配置,我们在js/common.js中对axios进行了统一配置:

一切OK。

跟踪CookieUtils

我们去Debug跟踪CookieUtils,看看到底是怎么回事:

我们发现内部有一个方法,用来获取Domain:

它获取domain是通过服务器的host来计算的,然而我们的地址竟然是:127.0.0.1:7007,因此后续的运算,最终得到的domain就变成了:

问题找到了:我们请求时的serverName明明是:api.leyou.com,现在却被变成了:127.0.0.1,因此计算domain是错误的,从而导致cookie设置失败!

解决host地址的变化

那么问题来了:为什么我们这里的请求serverName变成了:127.0.0.1:7007我配置的呢?

这里的server name其实就是请求的时的主机名:Host,之所以改变,有两个原因:

  • 我们使用了nginx反向代理,当监听到api.leyou.com的时候,会自动将请求转发至127.0.0.1:20001,即Zuul网关。
  • 而后请求到达我们的网关Zuul,Zuul就会根据路径匹配,我们的请求是/api/auth,根据规则被转发到了 127.0.0.1:7007 ,即我们的授权中心。

我们首先去更改nginx配置,让它不要修改我们的host:proxy_set_header Host $host;

把nginx进行reload:

nginx -s reload

这样就解决了nginx这里的问题。但是Zuul还会有一次转发,所以要去修改网关的配置(leyou-gateway工程):

重启后,我们再次测试。

最后计算得到的domain:

完美!

再次测试

我们再次登录,发现依然没有cookie!!

怎么回事呢?

我们通过RestClient访问下看看:

发现,响应头中还是没有set-cookie

这是怎么回事??

Zuul敏感头过滤

Zuul内部有默认的过滤器,会对请求和响应头信息进行重组,过滤掉敏感的头信息:

会发现,这里会通过一个属性为SensitiveHeaders的属性,来获取敏感头列表,然后添加到IgnoredHeaders中,这些头信息就会被忽略。

而这个SensitiveHeaders的默认值就包含了set-cookie

解决方案有两种:

全局设置:

  • zuul.sensitive-headers=

指定路由设置:

  • zuul.routes..sensitive-headers=
  • zuul.routes..custom-sensitive-headers=true

思路都是把敏感头设置为null

最后测试

再次重启后测试:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值