API网关服务组件Spring Cloud Zuul使用详解6(路由详解6:重定向问题)
作者:hangge | 2020-10-16 08:10
八、重定向问题
1,问题描述
比如我们在浏览器中通过 Zuul 发起了登录请求,该请求会被路由到某 WebSite 服务,该服务在完成了登录处理之后,会进行重定向到某个主页或欢迎页面。此时,仔细的开发者会发现,在登录完成之后,我们浏览器中 URL 的 HOST 部分发生的改变,该地址变成了具体 WebSite 服务的地址了。
(2)假设我们给 feign-consumer 服务添加一个 /test 接口,里面代码很简单,就是重定向到 a.html 页面:
@Controller public class TestController { @GetMapping(value = "/test") public String test() { return "redirect:a.html"; } }
(3)当我们通过 Zuul 网关来访问这个接口时:
(4)会发现跳转到的页面 URL 确实具体 Web 应用实例的地址,而不是网关的路由地址。这个问题非常严重,应为使用 API 网关的一个重要原因就是要将网关作为统一入口,从而不暴露所有的内部服务细节。
(5)通过浏览器工具查看请求详情,可以发现访问 /test 接口的请求结果状态码为 302,请求响应头信息中的 Location 指向了具体的服务实例地址:
2,解决办法
(1)该问题的根本原因在于 spring cloud zuul 在路由请求时,并没有将最初的 host 信息设置正确,添加如下配置即可:
zuul.add-host-header=true
(2)重启网关服务,再次访问 feign-consumer 服务的 /test 接口,可以看到这次跳转后的 URL 仍然是网关路由地址:
注意:其实应该跳转到 http://localhost:5555/feign-consumer/a.html 才对,没找到解决的方案。网上有人是自己在 zuul 上写个过滤器,我觉得这个可以不解决,因为现在都是前后端分离架构,不多数都不在后端进行跳转,zuul.add-host-header=true 只是为了不暴露真实的 ip 信息,如果要重定向到具体的前端页面可以自己配置 zuul.routes 到指定的服务上。
(3)通过浏览器工具查看请求详情,请求响应头信息中的 Location 指向的确实是网关地址:
全部评论(0)