【问题标题】:Redirecting Not Working with Https重定向不使用 Https
【发布时间】:2017-01-02 12:35:18
【问题描述】:

我有一个位于硬件负载平衡器后面的 Java servlet。负载均衡器只允许 https 请求。问题是当我在servlet中获取请求时,我只能看到http,似乎在到达servlet时已经解密,这是有道理的,因为servlet不应该担心安全性。但是,当我想在 servlet 中发送重定向时,该请求将被负载均衡器阻止,因为它将是一个 http 请求。

我阅读了一些解决方案,它们都类似于this one。基本上人们建议先添加一个 servlet 过滤器来捕获请求 url。

我试过了,但是没有用。我不太明白的是,只要 servlet 无法知道实际请求(http/https),servlet 过滤器如何提供帮助?我也想知道这个问题是否有任何标准解决方案,因为我认为它很常见。

【问题讨论】:

标签: java redirect servlets load-balancing


【解决方案1】:

您实际上可以知道对负载均衡器的请求是 http 还是 https。负载均衡器会向您发送某些标头,告诉您有关原始请求的信息。

例如,如果对负载均衡器的请求是 HTTPS,它将发送 X-SSL-Secure : true 标头。

请参考这里。

How can I know if the request to the servlet was executed using HTTP or HTTPS?

【讨论】:

  • 不幸的是,负载均衡器没有将X-SSL-Secure 标头传递给我。
  • @can you paste here all headers you can接收。可能他们正在发送其他一些标头。
  • 我检查了所有的标题,所有这些似乎都只是标准的,与安全无关。它是负载均衡器在 https 时设置某些标头的协议吗?
  • 是的。你有哪个负载均衡器?可能需要一些配置。
  • 不确定。据我所知,它是一个硬件负载平衡器,我不应该改变它。在这种情况下,可能需要做一些类似转发而不是重定向的事情。
【解决方案2】:

HTTPS 只是基于 SSL 的 HTTP 协议。它仅使用证书加密在您的客户端和服务器之间传输的数据包。

您的 Servlet 不应打扰使用何种底层机制。传输协议是您的客户端和容器之间的合同。您的 servlet 对网络级别的通信方式保持透明。

您收到的重定向警告可能是因为安全措施。通常,大多数现代浏览器都允许您从 HTTP 转到 HTTPS,但不能反过来。

例如 - 如果您的主页以 HTTPS 加载,但您的浏览器将阻止您通过 HTTP 进行的异步调用(任何 ajax 调用)。这样做是为了强制您在站点上的所有页面上使用 HTTPS。

您可能需要检查以下两种情况:

1) 您是否在客户端浏览器上收到此警告。正如我在上面已经解释的那样,这可能是您的问题的原因。

2) 与浏览器一样,您的负载均衡器可能会执行任何此类安全强制措施。

提示:通常每当我们在 servlet 或任何后端代码中使用重定向时。无论您在何处使用 URL,都不要明确指定协议。它可能在您的重定向代码或任何其他地方。即使在您正在生成的锚标记中

不要写:

<a href="http://mywebsite.com/page1"> page1 </a>

相反,让您的客户端浏览器处理协议(此外,如果 URL 位于同一域中,还使用域相对 URL。仅当它们在您的站点外部时才使用绝对 URL)。

<a href="mywebsite.com/page1"> page1 </a>

这样,无论您是否使用 HTTPS,您的相同 servlet/后端代码都能正常工作。

还有一件事:HTTPS 或基于 SSL 的 HTTP 位于您的客户端和 Web 服务器层之间。您的容器/应用程序服务器甚至不(或不应该)知道它们之间发生了什么。还建议在您的网络服务器和应用服务器之间使用 SSL 并进行端到端加密。

【讨论】:

  • 这正是我所理解的和我所做的。我只是response.sendRedirect("/context/path/")。它将重定向到http://hostname/context/path/。问题是硬件负载平衡器不允许任何 http 请求。所以在浏览器发出这样的请求后,它只会挂在那里,最后超时。负载均衡器不是我可以触摸和修改的。
  • 嗨@JFreebird,这个重定向发生在哪里?您的浏览器是否已经获得带有 http:// 的 url?如果是,那么在某个地方发生了 URL 重写。通常很多系统(尤其是内容管理系统)不希望发布损坏的 URL,并且它们具有称为 URL 重写机制的东西,它通过附加域名和协议重写 URL(因此将相对 URL 转换为绝对 URL) .检查您的 Web 服务层或负载平衡层是否有执行此操作的任何内容。
  • 我在我的 servlet 中发送重定向,浏览器得到响应,然后访问重定向 url。我的浏览器获得hostname/path 重定向网址而不是https。我认为这是因为 servlet 仅在发送重定向时才知道 http。 servlet 发送的 url 本身是完整的,但它是 http。所以我认为没有损坏的网址。
【解决方案3】:

在执行以下行之前,我们需要根据条件正确重定向请求。

response.sendRedirect("some.jsp");

保持架构/引荐如下:

String scheme      = request.getScheme();
String referer     = request.getHeader("referer");

最好使用引荐来源网址,因为架构并不总是能提供所需的结果。您可以在控制台调试器中检查该值。

然后在这样的条件下执行重定向:

String servername  = request.getServerName();
String scheme      = request.getScheme();
String referer     = request.getHeader("referer");

if(referer.startsWith("https")) {
    response.sendRedirect("https://" + servername + "/context-root/" + "some.jsp");
}else{
    response.sendRedirect("some.jsp");
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2010-12-12
    • 1970-01-01
    • 2022-01-11
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多