如何在代理后面配置 Spring HATEOAS?

How to configure Spring HATEOAS behind proxy?

我有 Spring 数据休息与 Hateoas 作为我的支持。它在代理后面。

后端 url:backend.com

代理 url:proxy.com

当我查询代理 url 时,例如http://proxy.com/items/1,我收到 hrefbackend.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 =].

参考