我怎么知道对servlet的请求是使用HTTP还是HTTPS执行的?


72

我用Java写了一个servlet,我想知道对该servlet的请求是使用HTTP还是HTTPS执行的。

我以为我可以用 request.getProtocol()但是两种方法都返回HTTP / 1.1。

有任何想法吗?

Answers:


101

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

  • ServletContainer本身是否可以接受https上的请求。
  • ServletContainer前面是否有LoadBalancer。并且,LoadBlancer在https上收到了请求,并已将请求分派到纯http上的ServletContainer 。在这种情况下,LoadBalancer将X-SSL-Secure:true标头发送到ServletContainer,应该遵循。

当在https上收到请求时,容器还应使此请求属性可用:

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

3
您能否分享一下您在哪里获得“ X-SSL-Secure:true”的信息?我一直在搜索,但找不到关于此标题的更多信息。
zbstof

1
这在我的环境中不起作用:Apache 2.4.10作为前端代理;这是在Java中无法知道的,而请求已经通过http或https完成了。当然,我将其作为Java的http获得,但是我需要知道如何访问前端代理。-确实,正如@Zotov也提到的那样:几乎没有关于X-SSL-Sercure标头的信息。因此,我认为这不会被广泛实施吗?
badera

标头名称可能会有所不同,因为它不是很标准。但是,这里的概念是代理可以添加有关SSL的标头,而服务器可以读取它们。对于Ex,Nginx添加了X-SSL-Protocol。它也可以替换为自定义标头。
拉梅什PVK

我猜想,您使用任何特定的Load Balancer作为f5,并且“ X-SSL-Secure:true”是可选标头,它不是任何(甚至不是负载均衡器)标准的一部分,对吗?
Marek-A-

29

您不能可靠地依赖端口号。
但是您可以依靠该方案:

使用:request.getScheme()以查看是否为https

如果是,则为安全连接。

我相信无论Tomcat版本如何,它都应该起作用


1
isSecure至少可以返回1.2,并且不是特定于Tomcat的。
马修·弗拉申


-3

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


7
@Krishnan端口号是任意的...我可以在443上运行HTTP,在80上运行HTTPS或它们的任意组合。
hd1 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.