zuul网关sensitiveHeaders设置

接上一篇文章 spring-session+redis+zuul session共享示例

在测试过程中,有发现一个问题,UserManagerA 和 UserManagerB 两个工程的session共享不起来,这时候没有BuyManager工程的事情。

示例工程

  1. servicecenter注册中心
  2. zuul网关
  3. UserManagerA 工程A
  4. UserManagerB 工程B

其中,servicecenter单纯做注册中心,zuul做网关路由功能。UserManagerA 和 UserManagerB作为用户服务两台应用服务

用户登录session处理在UserManagerA 和 UserManagerB 服务中,在任意一台服务创建session会话后,在另外一台服务中都可以看到。

工程代码

代码内容,UserManagerA 、UserManagerB 和 servicecenter代码与之前相同

zuul网关代码配置与之前不同,代码如下

# 服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 设置程序端口号为5000,服务名为zuul-service
server.port=5000
spring.application.name=zuul
# 将以"/um"开头的url路由到um服务
zuul.routes.um.path=/um/**
zuul.routes.um.serviceId=um
# zuul.routes.um.sensitiveHeaders=*
# 将以"/bm"开头的url路由到bm服务
zuul.routes.bm.path=/bm/**
zuul.routes.bm.serviceId=bm
# zuul.routes.bm.sensitiveHeaders=*
zuul.host.socket-timeout-millis=60000
zuul.host.connect-timeout-millis=60000

可以与之前的zuul配置比对,注掉了两行关于sensitiveHeaders的配置项,接下来工程测试

工程测试

启动各项服务,um两台服务和zuul网关服务

注册中心

http://localhost:5000/um/loginIn?token=redis 创建session

http://localhost:5000/um/go 测试session

通过后台redis里面,是可以看到session是存在于redis中,且尚未失效的。

取后台服务打印的session日志信息,由于日志内容过大,为了方便说明问题,这里session内容做一定的截取,只保留关键信息

第一次创建session时在8766端口号机子

session={"attributeNames":[],"creationTime":1609916311846,"id":"f8b8874b-b9f6-4f2a-8ed4-ba04b29ee665","lastAccessedTime":1609916311846,"maxInactiveInterval":120,"new":true}

我们可以看到,打印的session 内容中id信息为"f8b8874b-b9f6-4f2a-8ed4-ba04b29ee665",session里面的new标识为true,表示新创建session

该session与redis库中session匹配,没有问题

第二次请求时候,在8769机子上

session={"attributeNames":[],"creationTime":1609916181401,"id":"2a6023d9-dad5-4da6-a311-f2af6333aa37","lastAccessedTime":1609916181401,"maxInactiveInterval":120,"new":true}

这里的session id与创建session时候的不同,且session里面的new标识为true,表示为新建session,这个session在redis中不存在,应该是request请求到后台后,后台找不到对应的session后,新创建了session。

如果去掉网关zuul,直接使用端口号请求

http://localhost:8766/loginIn?token=redis 

和 http://localhost:8769/go ,session是可以共享起来的,由此说明问题出在了zuul网关上面。

sensitiveHeaders分析

为何出现这种情况,翻阅资料后发现zuul觉得“Cookies起着特殊的作用,因为它们在浏览器中具有明确的语义,并且它们总是被视为敏感的。”所以,在请求分发时候,默认屏蔽了cookie信息向后传递,zuul网关中对于敏感头信息默认配置如下

zuul.routes.um.sensitiveHeaders=Cookie,Set-Cookie,Authorization

zuul默认的拦截掉了请求头信息中cookie、set-cookie和Authorization几项信息,这样会导致这几项敏感信息不再向后传递

这里的配置可以修改,如果想传递哪个信息到后台,就从sensitiveHeaders中去掉哪一项。同样,如果要拦截哪一项信息,就在里面添加哪一项。

比如,请求头中包含x-user-info 头信息,如果想要拦截,则可以在sensitiveHeaders中配置

zuul.routes.um.sensitiveHeaders=x-user-info

官方文档说明,参考 https://www.springcloud.cc/spring-cloud-netflix.html ,参考中间zuul网关Cookie和敏感标题部分。

为了使请求头信息中cookie信息可以透传至后台,须要添加配置

zuul.routes.um.sensitiveHeaders=*

sensitiveHeaders后面为空或为*,表示可以允许所有信息传至后台,相当于不拦截任何请求头信息。

设置后,再请求服务,session可以正常共享。

 

 

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/112272325