这个问题似乎已经被问过多次,但是对于这种特殊情况,我没有找到合适的解决方案。
该应用程序是使用嵌入式Tomcat服务器并在Openshift上运行的Spring Boot1.5.x。后者具有一个带有HTTPS路由的路由器,该路由器可终止TLS隧道并将流量通过HTTP转发到应用程序容器。此外,它还会插入X-Forwarded-标头(包括X-Forwarded-Proto标头),以便使用https协议来组成应用程序重定向。
我已经在Spring Boot应用程序中配置了server.use-forward-headers: true
并对其进行了测试:
1)OK-> https://ocproute/myapp/将302重定向到我的主页,并保留https协议(Tomcat RemoteIpValve处理了它)。
2)失败-> https://ocproute/myapp(请注意,没有斜杠)将302重定向到http://ocproute/myapp/,因为您尚未调用RemoteIpValve,因此它将协议更改为http。 / p>
日志显示Tomcat的Http11InputBuffer接收到该请求,并在某些时候重定向了该请求,而没有考虑X-Forwarded-Proto标头。
如何解决?
2019-06-03T17:31:59.230 ( - - - - - ) o.a.t.u.n.NioEndpoint DEBUG - Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@1511311d:org.apache.tomcat.util.net.NioChannel@5209052:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8080 remote=/0:0:0:0:0:0:0:1:64871]], Read direct from socket: [595]
2019-06-03T17:31:59.230 ( - - - - - ) o.a.c.h.Http11InputBuffer DEBUG - Received [GET /myapp HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
X-Forwarded-Proto: https
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.9,en-US;q=0.8,es;q=0.7,cy;q=0.6
Cookie: JSESSIONID=4693A1F63CD3E18058F98E129D11CE57
]
...
答案 0 :(得分:0)
要完成这项工作,我必须禁用自定义Tomcat上下文的上下文根重定向:
@Configuration
class TomcatConfiguration : EmbeddedServletContainerCustomizer {
override fun customize(container: ConfigurableEmbeddedServletContainer) {
val factory = container as TomcatEmbeddedServletContainerFactory
factory.tomcatContextCustomizers = listOf(CustomCustomizer())
}
class CustomCustomizer : TomcatContextCustomizer {
override fun customize(context: Context) {
context.mapperContextRootRedirectEnabled = false
context.addServletContainerInitializer(WsSci(), null)
}
}
}