如何在代理后面配置 Spring HATEOAS?
How to configure Spring HATEOAS behind proxy?
我有 Spring 数据休息与 Hateoas 作为我的支持。它在代理后面。
后端 url:backend.com
代理 url:proxy.com
当我查询代理 url 时,例如http://proxy.com/items/1
,我收到 href
域 backend.com
链接的响应。我需要域名为 proxy.com
.
确保您的代理正在将 X-Forwarded-Host: proxy.com
header 添加到传递给 backend.com
的 请求。然后 Spring Hateoas 会自动生成 link hrefs with proxy.com
.
X-Forwarded-Host
可以包含端口。
另请参阅 other X-Forwarded-* headers,它们也受支持。
从 Spring-Boot 2.1 / Spring 5.1 开始,Spring 将处理 X-Forwarded-* 的责任从 Spring HATEOAS 转移到 Spring MVC.
https://jira.spring.io/browse/SPR-16668
您现在需要注册过滤器 bean。
最小实现:
@Bean
FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter()
{
FilterRegistrationBean<ForwardedHeaderFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new ForwardedHeaderFilter());
return bean;
}
虽然 Mariano 已经回答了这个问题,但我想补充一点,它适用于 Spring Boot。但是,如果您不使用 Spring Boot 而是使用 Spring 5.1.X 在部署在 J2EE 容器(如我的)中的传统 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>
除此之外,您还需要将 Hateoas 升级到版本 0.25.1,Hateoas 方面已修复此问题。
受到 Cyril Gambis 评论的启发,Spring 提供了一个 属性 server.use-forward-headers
,它至少从 1.3.0.RELEASE 开始存在。从 Spring Boot 2.2.0.RELEASE 开始,属性 已弃用,请改用 server.forward-headers-strategy
。
当你使用Spring Data Rest时,我建议设置server.forward-headers-strategy = framework
,然后Spring Hatoaes在x-forwarded-*
[=30的帮助下为href生成代理URI =].
参考
我有 Spring 数据休息与 Hateoas 作为我的支持。它在代理后面。
后端 url:backend.com
代理 url:proxy.com
当我查询代理 url 时,例如http://proxy.com/items/1
,我收到 href
域 backend.com
链接的响应。我需要域名为 proxy.com
.
确保您的代理正在将 X-Forwarded-Host: proxy.com
header 添加到传递给 backend.com
的 请求。然后 Spring Hateoas 会自动生成 link hrefs with proxy.com
.
X-Forwarded-Host
可以包含端口。
另请参阅 other X-Forwarded-* headers,它们也受支持。
从 Spring-Boot 2.1 / Spring 5.1 开始,Spring 将处理 X-Forwarded-* 的责任从 Spring HATEOAS 转移到 Spring MVC.
https://jira.spring.io/browse/SPR-16668
您现在需要注册过滤器 bean。
最小实现:
@Bean
FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter()
{
FilterRegistrationBean<ForwardedHeaderFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new ForwardedHeaderFilter());
return bean;
}
虽然 Mariano 已经回答了这个问题,但我想补充一点,它适用于 Spring Boot。但是,如果您不使用 Spring Boot 而是使用 Spring 5.1.X 在部署在 J2EE 容器(如我的)中的传统 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>
除此之外,您还需要将 Hateoas 升级到版本 0.25.1,Hateoas 方面已修复此问题。
受到 Cyril Gambis 评论的启发,Spring 提供了一个 属性 server.use-forward-headers
,它至少从 1.3.0.RELEASE 开始存在。从 Spring Boot 2.2.0.RELEASE 开始,属性 已弃用,请改用 server.forward-headers-strategy
。
当你使用Spring Data Rest时,我建议设置server.forward-headers-strategy = framework
,然后Spring Hatoaes在x-forwarded-*
[=30的帮助下为href生成代理URI =].