Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Heroku上的Jetty:如何在代码中判断是否使用了https_Java_Ssl_Heroku_Https_Jetty - Fatal编程技术网

Java Heroku上的Jetty:如何在代码中判断是否使用了https

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

我有一些servlet在Jetty中运行,部署在Heroku上,处理POST请求

一些(但不是全部)POST请求必须通过https发送。是否应强制请求使用https取决于POST请求的http主体

我需要从servlet内部弄清楚传入的请求是否使用了https(SSL),以便发送适当的响应。然而,我尝试过的一切似乎都不管用

我尝试了明显的
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发送的?