Java Heroku上的Jetty:如何在代码中判断是否使用了https
我有一些servlet在Jetty中运行,部署在Heroku上,处理POST请求 一些(但不是全部)POST请求必须通过https发送。是否应强制请求使用https取决于POST请求的http主体 我需要从servlet内部弄清楚传入的请求是否使用了https(SSL),以便发送适当的响应。然而,我尝试过的一切似乎都不管用 我尝试了明显的Java Heroku上的Jetty:如何在代码中判断是否使用了https,java,ssl,heroku,https,jetty,Java,Ssl,Heroku,Https,Jetty,我有一些servlet在Jetty中运行,部署在Heroku上,处理POST请求 一些(但不是全部)POST请求必须通过https发送。是否应强制请求使用https取决于POST请求的http主体 我需要从servlet内部弄清楚传入的请求是否使用了https(SSL),以便发送适当的响应。然而,我尝试过的一切似乎都不管用 我尝试了明显的HttpServletRequest.getProtocol(),但无论协议是http还是https,它显然都返回相同的常量 我尝试了HttpServletRe
HttpServletRequest.getProtocol()
,但无论协议是http
还是https
,它显然都返回相同的常量
我尝试了HttpServletRequest.isSecure()
,但是返回false,即使我的测试请求被发送到以https开头的url://
当我调用HttpUtils.getRequestURL(HttpServletRequest.toString()时代码>我得到一个以“http://”开头的明显重建的url,即使我的测试请求被发送到以“https://”开头的url
根据帖子“heroku有一些负载平衡器,我应该得到“x-forwarded-proto”头的值。该标题为空
仅供参考,我使用的是heroku api提供的默认SSL端点——我没有使用他们的SSL端点扩展,因为浏览器中没有加载此url(因此我不需要url中的自定义域)
有人能告诉我如何判断传入请求中是否使用了HTTPS吗?我对Heroku一无所知,但如果您正在以编程方式配置Jetty(而不是使用XML配置),则可能需要将SecureRequestCustomizer
添加到HttpConfiguration
中。它在请求上设置安全标志,并将方案设置为HTTPS。您可以找到一些示例,但简单地说:
final HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecurePort(httpsPort);
final ServerConnector httpConnector = new ServerConnector(server,
new HttpConnectionFactory(httpConfig));
httpConnector.setPort(httpPort);
server.addConnector(httpConnector);
final HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
httpsConfig.addCustomizer(new SecureRequestCustomizer()); // !!!
final HttpConnectionFactory httpsFactory = new HttpConnectionFactory(httpsConfig);
final SslConnectionFactory sslFactory = new SslConnectionFactory(sslCtx,
httpsFactory.getProtocol());
final ServerConnector httpsConnector = new ServerConnector(server,
sslFactory, httpsFactory);
httpsConnector.setPort(httpsPort);
server.addConnector(httpsConnector);
我也觉得很奇怪,这一记录不全的步骤是必要的。哦,我多么希望我能给你们多投一票!您是否尝试使用HttpServletRequest.getScheme()来标识请求是通过HTTP还是HTTPS发送的?