【问题标题】:Hateoas links generated with internal hostname instead of forwarded host after upgrade升级后使用内部主机名而不是转发主机生成的 Hateoas 链接
【发布时间】:2019-07-23 16:39:07
【问题描述】:
我们最近升级到 Spring 5.1.3 和 Hateoas 0.25,并开始面临生成链接的问题。
假设我们的域是 xyz.com,通过负载平衡器到达任何子系统的所有请求都被转发到主系统,其中生成的 hateoas 链接与 xyz.com 域有链接。
但是,升级后,为此类请求生成的 hatoas 链接现在具有内部主机名,例如。 host5678.internaldomain.com.
我遇到了一个为此记录的问题:https://github.com/spring-projects/spring-hateoas/issues/753,它通过https://stackoverflow.com/a/53269319 提供了一个临时解决方案,建议使用 FilterRegistrationBean
似乎 FilterRegistrationBean 可作为 Spring Boot 的一部分使用,我们不使用它,因此该解决方案是不可能的。
所以我尝试直接在应用程序 web.xml 中添加一个新的过滤器 ForwardedHeaderFilter。但是,这会导致将 HTTPS 转换为 HTTP 的重定向 URL 出现问题。
提到的另一个解决方案是升级到 0.25.1 并使用 Spring 属性 server.use-forward-headers=true。升级已完成,但由于我们使用 Spring XML 进行配置,因此我找不到与此属性等效的 XML。
对于这方面的任何帮助,我们将不胜感激。
【问题讨论】:
标签:
java
spring
spring-hateoas
【解决方案1】:
在浏览了源代码并尝试了一些不同的组合后找到了答案。
问题中提到的问题已在 Hateoas 版本 0.25.1 中得到修复,因此解决方案的一部分是将 Hateoas 升级到 0.25.1。
另一部分的灵感来自问题中给出的 SO 链接,但在我的情况下它并没有按原样工作,因为它仅适用于 Spring Boot。由于我们不使用 Spring Boot,但我们有一个使用 J2EE 容器运行的传统 Web 应用程序,因此解决方案是将 ForwardedHeaderFilter 作为 Web 应用程序的 web.xml 的一部分包含如下:
<filter>
<filter-name>forwardedHeaderFilter</filter-name>
<filter-class>org.springframework.web.filter.ForwardedHeaderFilter</filter-class>
<init-param>
<param-name>relativeRedirects</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>forwardedHeaderFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>