gpt4 book ai didi

java - Heroku 中的 SSL 重定向

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:52 25 4
gpt4 key购买 nike

我在让我的 Java 网络应用程序在 Heroku 上运行时遇到了很多麻烦。

这是我的:

一个使用 Spring Security 的 Java Web 应用程序(标准 war 文件),我的 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>

当我将我的 WAR 文件部署到 Heroku(使用 Atlassian Bamboo 的 Heroku 部署插件)并且应用程序启动时,我最终在我的浏览器中收到“太多重定向”错误 - 看起来它需要做一些事情在 https 和 http 之间切换,但我不知道我需要做什么来修复它。

我现在只想使用 piggyback SSL,因为 SSL 附加组件对我的业余项目来说相当昂贵(每月 20 美元)。

最佳答案

我通过组合使用 requires-channel 解决了类似的问题在我的 Spring Security 配置和 Tomcat 的 RemoteIpValve 中.如果你没有使用 Spring Security,配置 RemoteIpValve应该足够了(下面假设你使用优秀的 webapp-runner 作为你的容器)我想有一个 jetty-runner 的等价物,但我不知道......

问题是 Heroku 的网络/路由层处理 SSL,并将请求作为纯 HTTP 代理到您的网络应用程序。所以 Tomcat 不知道请求在其他地方是安全的(SSL 卸载)RemoteIpValve通过查看由处理 SSL 的代理服务器设置的 HTTP header ,本质上覆盖了 Tomcat 看到的协议(protocol)、端口和 IP 地址(以及 request.isSecure() 的评估方式)。

创建一个 context.xml具有以下内容:

<Context>
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" protocolHeader="x-forwarded-proto" portHeader="x-forwarded-port"/>
</Context>

这三个 header ( x-forwarded-forx-forwarded-protox-forwarded-port )由 Heroku 的路由层自动发送。

接下来,确保该文件被复制到您的 Maven 目标目录中的某处(我将它放在与 webapp-runner 本身相同的目录中)。在 pom.xml :

<resources>
<resource>
<directory>${basedir}/src/main/resources/META-INF</directory>
<includes>
<include>context.xml</include>
</includes>
<targetPath>${project.build.directory}/dependency</targetPath>
</resource>
</resources>

最后,确保 webapp-runner 指向 context.xml(例如,使用支持 context-xml 参数的 webapp-runner 7.0.30.1)。在你的Procfile :

web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --context-xml target/dependency/context.xml ...etc...

最后一点,我使用 Spring Security requires-channel<sec:intercept-url>通过翻转环境变量在 HTTP 和 HTTPS 之间来回切换 - 在我的本地开发箱上取消设置以便于配置,在 Heroku 上设置(通过 heroku config )以在不同环境中有选择地强制使用 SSL。

希望这对你有用...

关于java - Heroku 中的 SSL 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13397034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com