java - Heroku 上的 jetty : how to tell in code if https was used

标签 java ssl heroku https jetty

我有一些 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/

相关文章:

java - Gradle - 在编译期间执行自定义注释处理器

java - 如何捕获算术异常

java - 使用 Java 通过 SSL 连接 MQ7.X

使用 TortoiseGit 和 Ansible 执行 Git Pull/Clone 时出现 GitLab SSL 握手错误

php - Nginx 的 WordPress HTTPS (SSL) 永久链接配置

django - Heroku 创建了表,但是当我要迁移时,他说没有创建

heroku - 当我的应用程序遇到内部错误时如何触发电子邮件警报?

运行时两个类之间的 JAVA 类型安全

java - Spring Cache 不适用于抽象类

ruby-on-rails - Heroku] 处理数据库