解决Cookie写入问题
cookie里面什么信息都没有
为什么没有呢?
解决办法汇总(具体看下方)
-
跨域问题。允许跨域的域名不能是
*
,而应该是具体的。并且要允许cookie -
前台代码没有允许使用cookie
-
nginx转发时头信息没有加上域名信息,导致转发后域名变为了本地的域名
-
Zuul转发时没有在头信息添加域名信息
-
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
最后测试
再次重启后测试: