使用Spring Boot为X-FORWARDED-PROTO配置嵌入式Jetty 9

我正在AWS中运行Spring Boot应用程序.该应用程序在Elastic Load Balancer(ELB)后面运行. ELB配置为使用https(端口443)访问外部环境,但通过http(端口8080)传递给应用程序. ELB被配置为通过x-forward-proto标头.我在Spring Boot 1.1.5 RELEASE中使用Jetty 9.0.0.M0.

我似乎正在通过ELB从应用程序发送回不正确的重定向,其中重定向响应以http而不是https的形式返回.现在,我读到here,应该使用以下命令将“ forwarded”标头设置为true:

<Set name="forwarded">true</Set>

我看不到如何在Spring Boot中使用Jetty的嵌入式版本执行此操作,因为源中没有XML配置文件.

我已经看过EmbeddedServletContainerCustomizer基础结构,但仍然无法正确地使该设置正常工作.

该应用程序是在AWS https环境之外构建和测试的,因此该应用程序也需要透明地使用http.直接到达应用程序端点,而无需通过ELB.只是ELB到应用程序的路由不起作用.

有任何想法吗?

解决方法:

我本人也遇到过类似的问题,在研究过程中偶然发现了您的问题.我发现这很容易编程,但是在Jetty文档中并没有真正解释.

Jetty xml配置文件的结构与Java API的结构相匹配,因此您只需将其复制为代码即可.

因此,遵循关于如何使用XML配置文件here进行配置的Jetty指南

我能够以编程方式配置嵌入式服务器,如下所示:

    Server server = new Server( port );

    // Create HTTP Config
    HttpConfiguration httpConfig = new HttpConfiguration();

    // Add support for X-Forwarded headers
    httpConfig.addCustomizer( new org.eclipse.jetty.server.ForwardedRequestCustomizer() );

    // Create the http connector
    HttpConnectionFactory connectionFactory = new HttpConnectionFactory( httpConfig );
    ServerConnector connector = new ServerConnector(server, connectionFactory);

    // Make sure you set the port on the connector, the port in the Server constructor is overridden by the new connector
    connector.setPort( port );

    // Add the connector to the server
    server.setConnectors( new ServerConnector[] { connector } );
上一篇:Embedded Jetty无法识别Spring MVC Security


下一篇:jetty源代码剖析