
在构建基于Spring Cloud微服务框架时,用了常使用的框架NGINX+ZUUL+Eureka+业务服务,Session用Spring boot的Redis集成,所有微服务间共享Session。
所有业务的微服务Rest接口前端调使用接口通过ZUUL进行转发,而ZUUL通过创立ZUULFilter过滤器来对请求鉴权及少量Session操作,而且为了保证Session实时生效,故设置Spring boot的Redis Session公告为立即生效,如下所示:
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
在第一次业务请求时ZUUL过滤器会创立Session并设置属性,而后直接将请求转发到业务服务,
然而业务服务在调使用方法时通过request.getSession(false)获取的Session为null,但紧接着第二次及后续调使用时业务服务都可以获取到了正确的Session。
这么奇葩的现象,第一次Session创立成功居然Session不可以传递,实在是令人匪夷所思。
因为没有特殊定制过Spring boot Session机制,都是用默认的Cookie传递方式。业务服务获取不到Session,有两种可可以,一种是Redis没有实时创立Session对象,另外一种是业务不可以通过SESSIONID获取到对象。
通过Debug断点定位,在ZUUL创立Session时,通过Redis用户端,直接连接到Redis服务器,查看发现Redis实时的生成了Session对象,故第一个假设应该不成立的。
而后通过打印在ZUUL与业务服务中Request Cookie信息,发现ZUUL在创立完Session后,并没有升级request的Cookie中的SESSIONID,且request.isRequestedSessionIdValid()为false,故业务第一次获取到的request中的Cookie没有新的SESSIONID,就更不可以根据Cookie获取Session了,第二种假设成立。
通过查询资料,明白了只有在请求Response响应后请求的Cookie才会升级,第一次请求时创立的Session不会在微服务间进行传递。天真的认为能宽心的用Spring cloud全家桶,殊不知还是需要细心与思考,同时也许需要知识积累。
从单体引使用根本不会出现这种情况,Session在一个服务中传递,不存在Session重新通过Cookie获取。而微服务简化了业务,但多了交互,外部交流越多,越容易出错,也许在微服务的路上还有更多的坑需要填补。
¥10.00
金考典题库激活码一级二级建造师造价监理初级中级经济师会计二建
¥185.00
FIFA23 Origin/STEAM PC中文正版足球游戏 官网激活码CDK 自动发货
¥13.00
Steam 城市天际线 激活码Key Cities Skylines 都市天际线 天际线 PC正版游戏园区不夜城全套造城市全dlc
¥79.00
PC中文正版steam 女神异闻录4 黄金版 无敌究极后桥背摔 P4G P4AU 国区激活码 cdkey 正版游戏
¥39.00
PC中文正版 Steam 欧卡2 Euro Truck Simulator2 欧洲卡车模拟2 DLC法兰西 意大利 波罗的海彼岸cdkey 激活码
¥119.00
PC中文Steam 只狼影逝二度 Sekiro Shadows Die Twice GOTY Edition只狼年度版cdkey激活码 只狼key 正版游戏