cookie写入问题

文章目录

    1 问题分析

    2 跟踪CookieUtils

    3 解决host地址的变化

    4 网关的反向代理

    5 Host写入问题

        5.1 网关写入Host

        5.2 敏感头过滤导致cookie没有写入

        5.3 防止过滤器过滤Host

    6 Zuul的敏感头过滤

接上一篇鉴权微服务中间留下的问题,专门来分析解决一下这个问题,首先我们登录,然后查看cookie:

在这里插入图片描述

却发现cookie中空空如也,这是为什么?

1 问题分析

我们在之前测试时,清晰的看到了响应头中,有Set-Cookie属性

在这里插入图片描述

为什么在这里却什么都没有?

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

    服务的响应头中需要携带Access-Control-Allow-Credentials并且为true。

    响应头中的Access-Control-Allow-Origin一定不能为*,必须是指定的域名

    浏览器发起ajax需要指定withCredentials 为true

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

在这里插入图片描述

没有任何问题。

我们再来仔细看一下区别:调试的时候访问的是http://localhost:8087/login,但是浏览器访问的却是http://api.leyou.com/api/auth/ogin,那我们再用这个地址调试一次:

在这里插入图片描述

现在我们找到问题了!——路径问题!

但是路径变化会引起什么变化呢?——网关问题或者nginx问题二者都有可能产生问题,要逐一排查

2 跟踪CookieUtils

除了上面那两个原因,其次我们想,写cookie这个代码有没有问题,为什么刚才有现在又没有了呢?我们写cookie使用的是工具类:CookieUtils,先看一下可以正常生成的cookie信息:

返回header:

    LY_TOKEN=eyJhbGciOiJSUzI1NiJ9.eyJpZCI6MzIsInVzZXJuYW1lIjoiZGlhbmVtYXgiLCJleHAiOjE1NTUzMzE2MjF9.cYjoy_DaqlYx5GumxU7TExtENS1KBvNg_Sjdo1PBcW_tjYBu1xXtWfkwQV1_y03ttDcvs0PF3fQWkJOkmICv3n8Dy0do_M6KMMjG7fcNW-Mmk2blunOhw69o9ZSx0W0MSNGVMjR38OLyi9OumG3FzX2XjRB6GO_veBwMB5cmU; Domain=localhost; Path=/;HttpOnly

我们发现cookie的 domain属性似乎不太对。我们去Debug跟踪CookieUtils,看看到底是怎么回事:

    我们发现内部有一个方法,用来获取Domain,先通过request.getRequestURL()方法来获取请求路径

    我们设置断点,在产生token的 cookieUtils中的build()函数设置断点,单步执行

    执行到setDomain,首先由request.getRequestURL()获取请求路径

    此时发现请求路径被改变了,发现URL从http://www.leyou.com/变成了serverNamehttp://127.0.0.1:8087/login

    之后经过一些截取操作,serverName变成了0.0.1,

    但如果是api.leyou.com的话,最终就变成了leyou.com,而leyou.com是所有相关网站的共同后缀,可以供leyou所有网站来访问,这就很完美

在这里插入图片描述

    那原因是什么呢?——serverName的问题

    serverName是http://127.0.0.1:8087/login,所以不管怎么截取都是有问题的

    问题找到了:

    我们请求时的serverName明明是:api.leyou.com,现在却被变成了:127.0.0.1,因此计算domain是错误的,cookie也是有domain(域) 的限制,一个网页,只能操作当前域名下的cookie,但是现在我们看到的地址是0.0.1,而页面是www.leyou.com,域名不匹配,cookie设置肯定失败了!

3 解决host地址的变化

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

这里的serverName其实就是请求的时的主机名:Host,serverName没问题,后续的自然会没问题,之所以改变,原因就是反向代理:当访问leyou域名时,这个域名指向了虚拟机

我们打开nginx.conf,查看配置:

在这里插入图片描述

要想解决这件事,首先要知道request.getRequestURL tomcat是怎么拿到域名地址的?

首先在浏览器F12控制台 随便打开一个js请求

在这里插入图片描述可以发现Request URL:http://www.leyou.com/plugins/jquery/jquery.min.js

上述URL在request中其实被分成了几段来表示:

    Host:www.leyou.com——host

    GET /js/plugins/jquery/jquery.min.js HTTP/1.1——路径和协议

全路径其实就是请求 host+端口(默认是80)+路径 拼在一起得到的 ,影响我们得到域名的原因就是Host ,后面的路径我们不关心! host其实是请求头的一部分,当我们反向代理的时候,nginx已经将请求头Host转换成了192.168.124.1,于是在nginx反向代理时多设置一个Host头。

将nginx的conf文件修改,添加:

proxy_set_header Host $host

    1

$host代表的是上一次原生请求的host,原生的请求一定是api.leyou.com,它会读取原生请求的host放到$host的位置,变成

proxy_set_header Host api.leyou.com

    1

到此为止,重启nginx

nginx -s reload

    1

再次测试:

在这里插入图片描述

还是有问题。。。

4 网关的反向代理

其实刚才的问题没有找全,nginx把请求路径代理到了htto://192.168.124.1:10010,但是我们拿到的serverName还是http://127.0.0.1:8087,怎么从10010端口变成了8087端口呢,因此这不光是nginx的问题,网关也做了一次反向代理

因为网关是不能自己处理的,他会把请求转发到微服务8087来进行处理,现在我们把网关用debug启动,在网关中有很多过滤器,这些过滤器默认继承自ZuulFilter,在其中一个PreDecorationFilter的run方法打个断点,查询host,调用方法ctx.getRequest().getHeader("host"):

在这里插入图片描述

发现此时的host是api.leyou.com 是正确的,说明我们nginx的配置生效了,理论上此时放行,是不会出现错误的,如果此时出现错误,那就是网关没有将host写进去

5 Host写入问题

5.1 网关写入Host

事实上,到此为止并没有将host写进去,原因是有个if判断 ——porperties.isAddHostHeader(),成立才将host写入,点进方法发现AddHostHeader是一个boolean值,值为false,属于ZuulProperties,前缀是zuul,修改这个值很简单:

在这里插入图片描述

继续debug运行看看有没有写入成功:

在这里插入图片描述

可以看到domain写入成功了,那我们来测试一下:

在这里插入图片描述

发现,响应头中还是没有set-cookie!事实上到这里还没有结束,单单设置这个是不行的

5.2 敏感头过滤导致cookie没有写入

过滤器中还有一个addIgnoredHeaders方法,会对一些头进行忽略,会对敏感头进行过滤

在这里插入图片描述

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

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

在这里插入图片描述

现在set-cookie被滤掉,因此问题和原因我们知道了,但是先不管,我们先来看Host可不可以正常传递,debug发现Host还是没有被拿到!!!

5.3 防止过滤器过滤Host

ZuulFilter下面还有一个叫RibbonRoutingFilter的过滤器,做负载均衡路由的方法

在这里插入图片描述

它有一个构建上下文的方法:

在这里插入图片描述

在构建上下文中会先获取头信息:

在这里插入图片描述

然后对头做一些判断:

在这里插入图片描述

判断方法:

在这里插入图片描述

如果是被允许的头信息,才会将其添加到Headers中去,如果头是被忽略的,则不会被添加,但是下面有一个switch语句,如果name是host,则忽略!因此host永远不会被添加进去

最后:尽管yml中设置了true,Host被添加进去了,但是由于这个过滤器,又被忽略掉了。因此无论如何我们都没办法把Host添加进去,这是一个bug

解决办法:

对比了上一个SpringCloud版本的源码,发现是没有if判断的,说明是因为加了这一段导致错误,因此我们修改一下版本

在这里插入图片描述

再次测试:

在这里插入图片描述

Host终于被添加进来了!此时再次debug程序,可以看到已经拿到了正确的domain:

在这里插入图片描述

6 Zuul的敏感头过滤

我们已经在前面5.2部分分析了cookie没有被写入的原因,我们现在来解决它:

解决方案有两种:

全局设置:

    zuul.sensitive-headers=

    在这里插入图片描述

指定路由设置:

    zuul.routes.<routeName>.sensitive-headers=

    zuul.routes.<routeName>.custom-sensitive-headers=true

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

现在再来测试一次:

在这里插入图片描述

一切正常,到此位置,cookie的写入问题被完美解决了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,521评论 0 6
  • 深入浅出HTTP协议(WEB开发和面试必备) 1.基础概念篇 a.简介 HTTP是Hyper Text Trans...
    半世韶华忆阑珊阅读 1,217评论 0 7
  • 国庆假期的最后一天,回顾这周,爬了山,看了电影,读了书,写了文章,投了稿,做了饭,庆了生,也算是充实。当然,这之后...
    聂一一阅读 107评论 0 0
  • 三、风雨进村路 成都,都说是一座来了就不想走的城市。诚然,对这座城市,已经流连无数次了,不论是自驾川西、还是西藏返...
    xxq相伴阅读 402评论 1 4
  • 今天是周一,坐在课堂上的我由于严重缺乏睡眠,老师讲的课我是竖起了耳朵也没听懂。于是,聊聊这个周末去首尔的feeli...
    最美四月天77阅读 246评论 0 0