我正在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 } );