我有一些 servlet 在 Jetty 中运行,部署在 Heroku 上,处理 POST 请求。
一些(但不是全部)POST 请求必须通过 https 发送。是否应强制请求使用 https 取决于 POST 请求的 http 正文。
我需要从 servlet 内部弄清楚传入请求是否使用 https (SSL),以便我可以发送适当的响应。但是,我尝试过的任何方法似乎都不起作用。
我尝试了明显的HttpServletRequest.getProtocol()
,但无论协议(protocol)是http
还是https
,它显然都会返回相同的常量。
我尝试了HttpServletRequest.isSecure()
,但是即使我的测试请求发送到以 https://开头的网址,它也会返回 false
当我调用 HttpUtils.getRequestURL( HttpServletRequest ).toString();
时,我得到一个以“http://”开头的明显重构的 url,即使我的测试请求发送到了以“http://”开头的 url与“https://”
根据帖子“Enforce HTTPS with Embedded Jetty on Heroku ”,heroku 有一些负载均衡器,我应该获取“x-forwarded-proto” header 的值。该标题为空。
仅供引用,我正在使用heroku api提供的默认SSL端点——我没有使用他们的SSL端点扩展,因为这个url没有在浏览器中加载(所以我不需要在url中添加自定义域) )。
谁能告诉我如何判断传入请求中是否使用了 HTTPS?
最佳答案
我对 Heroku 一无所知,但如果您以编程方式配置 Jetty(而不是使用 XML 配置),您可能需要将 SecureRequestCustomizer
添加到您的 HttpConfiguration
。它在请求上设置安全标志,并将方案设置为 HTTPS。您可以找到示例here ,但简单地说:
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);
我也感到相当惊讶,这个记录不充分的步骤是必要的。
关于java - Heroku 上的 jetty : how to tell in code if https was used,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22501765/