我有一个 Java Web 应用程序,我在其中定义了某些 URL 只能通过 HTTPS 访问 - 这是使用 web.xml 中的安全约束定义完成的,如下所示:
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL URLs</web-resource-name>
<url-pattern>/j_spring_security_check</url-pattern>
<url-pattern>/secure/account/create</url-pattern>
<url-pattern>/register</url-pattern>
<url-pattern>/login/*</url-pattern>
<url-pattern>/</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
我的问题是,当我将应用程序部署到 Heroku 并尝试背负其 SSL 连接时,我的应用程序位于负载均衡器后面,并且进入应用程序的每个请求都是 HTTP,因此,我的 web.xml 中的上述定义强制重定向到 SSL URL,它再次作为 HTTP 进入应用程序,因此它最终进入重定向循环,在我的浏览器中显示为错误。
我不太确定如何处理这个问题,我读过我可以查看 x-forwarded-proto,它应该告诉我原始请求是 https 还是 http,但我不知道该怎么处理它因为上面的安全约束总是会起作用。我应该删除安全约束部分并以编程方式强制执行 https 吗?这对我来说似乎并不理想。