在Heroku上使用嵌入式Jetty强制执行HTTPS

在Heroku上使用嵌入式Jetty强制执行HTTPS,heroku,https,jetty,Heroku,Https,Jetty,我们有一个运行嵌入式Jetty的Javaservlet,它使用“SSL端点”插件部署到Heroku。我要求应用程序中的所有页面都通过HTTPS提供服务,无论用户是使用http还是HTTPS导航到我们的应用程序 应用程序识别通过https发出的请求,但也接受http请求而不重定向(不应该这样做)。此外,如果用户从https连接开始,那么每当发布表单并将其重定向到“GET”请求时,所有https连接都会恢复为http 我尝试添加一个URL筛选器,该筛选器将“http://”更改为“https://”

我们有一个运行嵌入式Jetty的Javaservlet,它使用“SSL端点”插件部署到Heroku。我要求应用程序中的所有页面都通过HTTPS提供服务,无论用户是使用http还是HTTPS导航到我们的应用程序

应用程序识别通过https发出的请求,但也接受http请求而不重定向(不应该这样做)。此外,如果用户从https连接开始,那么每当发布表单并将其重定向到“GET”请求时,所有https连接都会恢复为http

我尝试添加一个URL筛选器,该筛选器将“http://”更改为“https://”,并使用以下代码执行重定向(为了简洁起见,已删除导入):

然后,我将其添加到我的web.xml文件中:

<filter>
  <filter-name>urlFilter</filter-name>
  <filter-class>org.stjude.radio.ui.filters.UrlFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>urlFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

urlFilter
org.stjude.radio.ui.filters.urlpilter
urlFilter
/*
这种方法的问题是,应用程序返回“太多重定向”错误(重定向循环)

我相信这个问题已经解决了,但我一生都找不到我需要做什么才能使这项工作成功

顺便说一句,我还尝试将以下内容添加到web.xml中,但这只会导致请求失败

<security-constraint>
  <web-resource-collection>
    <web-resource-name>SSL Pages</web-resource-name>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>PUT</http-method>
    <http-method>POST</http-method>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

SSL页面
/*
得到
放
邮递
保密的

非常感谢您的帮助。

您需要检查
x-forwarded-proto
标题以查看请求是否安全:

Boolean secure = false;
if (request.headers.get("x-forwarded-proto") != null) {
  secure = request.headers.get("x-forwarded-proto").values.contains("https");
}
System.out.println("secure = " + secure);

我已经与Heroku进行了核对(可能我在这里错过了一个版本,以及buildpack,等等),但您肯定没有得到这些信息:

  • 指向http的X-Forwarded-Proto点
  • HttpServletRequest#方案返回http
  • HttpServletRequest#安全返回false

James,这是特定于Heroku的吗?
x-forwarded-proto
是负载平衡器事实上的标准,用于让备份服务器知道请求进入负载平衡器的协议。谢谢,James。我试试看。好小费!这解决了我在AWS Elastic Beanstalk上遇到的问题。Jetty可以自动处理
x-forwarded
属性-这是通过
ForwardedRequestCustomizer
完成的(如Jetty“”文档页面中所述)。这避免了许多其他的
x-forwarded
相关问题,例如servlet中的重定向总是重定向到http资源和使用身份验证时出现的问题。过滤器中使用的
getRequestURL()
不包括原始URL的查询部分,因此在重定向时会丢失。还应该检查
getQueryString()
是否为非null,并附加该值(前面有一个“?”)。
Boolean secure = false;
if (request.headers.get("x-forwarded-proto") != null) {
  secure = request.headers.get("x-forwarded-proto").values.contains("https");
}
System.out.println("secure = " + secure);