0

我有一个简单的问题。我希望

httpServletResponse.setHeader(“Location”, httpServletRequest.getRequestURL().toString())

会回到自己。但是在我们使用 IIS 和多个 TOMCAT 的集群基础架构中

httpServletRequest.getRequestURL() 

指向 IIS(集群管理器)。这是正确的行为,因为我不确定吗?重定向目前失败。我确实知道我可以使用相对地址(并且有效),但我只想知道观察到的行为(重定向失败)是否符合预期?

4

1 回答 1

2

重定向向客户端(浏览器)发送响应,有效地要求浏览器发送一个全新的请求。

这样做的结果是,这条路线将从头开始。如果应用程序服务器前面有反向代理和负载平衡器,那么重定向可能会转到应用程序的不同实例(不同的集群成员)。

要将请求发送到同一服务器上同一应用程序中的不同资源,请使用forward而不是发送重定向:

httpServletRequest.getRequestDispatcher(httpServletRequest.getContextPath())
       .forward(request, response);

上面的代码理论上会将请求发送到同一个 servlet 实例。

重定向目前失败。

失败的原因有很多。最有可能的是您的反向代理 (IIS) 正在使用本地网络地址与您的应用程序服务器通信(例如Host标头中的内部 IP 地址等)。您可能需要重定向到浏览器最初使用的主机名(如果域名已知,或者您可以让反向代理Host以某种方式转发标头)。一些反向代理/Web 服务器支持重写。

于 2018-08-22T08:29:34.503 回答