Heroku中的SSL重定向

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

这就是我所拥有的:

使用Spring Security的Java Web应用程序(标准war文件),我的web.xml中有一个安全约束部分,如下所示:

  SSL URLs /j_spring_security_check /secure/account/create /register /login/* / GET POST   CONFIDENTIAL   

当我将WAR文件部署到Heroku(使用Atlassian Bamboo的Heroku部署插件)并且应用程序启动时,我最终在浏览器中收到“太多重定向”错误 – 看起来它与之间的轻弹有关https和http,但我无法弄清楚我需要做些什么来修复它。

我现在只想使用背负式SSL,因为SSL插件对于我的爱好项目而言相当昂贵(每月20美元)。

我通过在Spring Security配置中使用requires-channel和Tomcat的RemoteIpValve来解决类似的问题。 如果您不使用Spring Security,配置RemoteIpValve应该足够了(以下假设您使用优秀的webapp-runner作为您的容器)我想有一个等同于jetty-runner,但我不知道…

问题是Heroku的Web /路由层处理SSL,并将请求作为普通HTTP代理到您的webapp。 所以Tomcat不知道请求在其他地方是安全的(SSL卸载) RemoteIpValve实际上是通过查看HTTP RemoteIpValve覆盖Tomcat看到的协议,端口和IP地址(反过来,如何评估request.isSecure() )由处理SSL的代理服务器设置。

使用以下内容创建context.xml

    

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

接下来,确保将文件复制到maven目标目录中的某个位置(我将其放在与webapp-runner本身相同的目录中)。 在pom.xml

   ${basedir}/src/main/resources/META-INF  context.xml  ${project.build.directory}/dependency   

最后,确保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安全requires-channel 通过翻转环境变量在HTTP和HTTPS之间来回切换 – 在我的本地开发盒上取消设置以便于配置,在Heroku上设置(通过heroku config )有选择地在不同的环境中强制使用SSL。

希望这对你有用……

我使用webapp-runner面临完全相同的问题并通过简单地使用--proxy-base-url https://example.com修复它,如此处所述

@bimsapi提供的解决方案为我工作。 我使用这个解决方案遇到了两个问题。 一旦我解决了那些它完美的工作。

首先,我必须将context.xml文件直接放在war文件的根目录下的META-INF目录中。

其次,您提供给–context-xml属性的context.xml文件的路径是文件系统上根目录而不是war文件的相对路径。 例如–context.xml ./tartget/myapp/META-INF/context.xml。

在我给出–context.xml META-INF / context.xml之前,这是错误的。