场景:
应产品要求,在原有spring cloud构建的微服务基础上,需要依据原有Manager微服务再搭建一个Manager微服务作为管理系统测试系统。因此,同一套微服务中Manager和Test-Manager拥有两套登录机制。
考虑可以使用同一个zuul路由不同的服务名Manager和Test-Manager使用一个微服务实现两套系统。
出现的问题:
1、登录测试系统页面报错,重定向次数太多?
原因:需要在zuul的过滤器中添加新增服务的过滤条件,否侧login请求被过滤会一直重定向。
2、可以进入登录页面,但是访问index时返回302?
原因:查看在zuul过滤器中是否可以收到前端Cookie信息,如果没有,需要检查zuul配置是否将请求头信息滤掉。
默认情况下,Spring Cloud Zuul在请求路由时,会滤掉HTTP请求头信息中的一些敏感信息,防止他们被传递到下游的外部服务器,默认敏感信息通过zuul.sensitiveHeaders参数定义,包括Cookie,Set-Cookie,Autorization三个属性。所以,我们在开发Web项目时常用的Cookie信息在Spring Cloud Zuul网关默认是不会传递的,因此导致我们登录无法鉴权。解决这个问题方法如下:
●通过设置全局参数为空来覆盖默认值:
zuul.sensitiveHeaders="*"
这种方法并不推荐,虽然可以实现Cookie的传递,但是破坏了默认设置的用意。在微服务架的API网关中,对于无状态的RESTful API请求肯定是要多余这些WEB类应用请求的,甚至还有一些架构设计会将Web类应用和App客户端一样都归为API网关之外的客户端应用。
●通过设置全局参数为空来覆盖默认值:
#方法一:对于指定路由开启自定义敏感头
zuul.routes.<router>.customeSensitiveHeaders=true
#方法二:将指定路由敏感头 甚至为空
zuul.routes.<router>.sensitiveHeaders=
注:其中<router>为自己指定服务路由名称
比较推荐这两种方法,仅对指定WEB应用开启敏感信息传递,影响范围小,不至于引起其他服务信息泄露问题。