2011-11-20 39 views

回答

83

HttpSerlvetRequest.isSecure()就是答案。 ServletContainer负责在以下情况下返回true:

  • 如果ServletContainer本身可以接受https请求。
  • 如果在ServletContainer前面有LoadBalancer。并且,LoadBlancer已收到请求https并已将其分发到平原http上的ServletContainer。在这种情况下,LoadBalancer会发送X-SSL-Secure:真正的头部到ServletContainer,这应该被尊重。

容器也应该当HTTPS收到请求该请求属性可供选择:

  • javax.servlet.http.sslsessionid
  • javax.servlet.request.key_size
  • javax.servlet.request.X509Certificate
+1

您可以请分享您在哪里获得'X-SSL-Secure:真实'位?我一直在搜索,我无法找到有关此标题的更多信息。 – Zotov

+0

这不适用于我的环境:Apache 2.4.10作为前端代理;在java中知道这个请求是不可能的,因为这个请求是通过http或https到apache完成的。当然,我把它当作http来访问Java,但我需要知道,前台代理如何被访问。 - 事实上,正如@Zotov也提到的那样:几乎没有关于X-SSL-Sercure标题的信息。所以我认为这不是大致实施?! – badera

+0

标题名称可能不同,因为它不是很标准。但是,这里的概念是代理可以添加关于SSL的标题,服务器可以读取它们。对于Ex,Nginx添加了X-SSL协议。它也可以用自定义标题代替。 –

10

isSecure。一定要检查继承的方法。

-3

https和http在不同的端口上运行。因此,您可以从请求中获取端口,并知道请求来自哪个端口,以便您可以了解该协议。 int port = request.getServerPort();

+4

@Krishnan端口号是任意的......我可以在44上运行HTTP 3和HTTPS 80或其任何组合。 – hd1

23

您无法可靠地依赖于端口号。
但是你可以依赖该方案:

使用:request.getScheme()看看它是否是https

如果是,那么它是安全连接。

我相信不管这应该工作的Tomcat的版本

+1

isSecure至少回到[1.2](http://download.oracle.com/javaee/1.2.1/api/javax/servlet/ServletRequest.html#isSecure%28%29),并且不是Tomcat特定的。 –

相关问题