如何知道对servlet的请求是使用HTTP还是HTTPS执行的?

时间:2011-11-20 10:15:55

标签: java servlets ssl https http-protocols

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

我以为我可以使用request.getProtocol(),但它会在两种方法上返回HTTP / 1.1。

有什么想法吗?

4 个答案:

答案 0 :(得分:93)

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

  • 如果ServletContainer本身可以接受https上的请求。
  • 如果ServletContainer前面有LoadBalancer。并且,LoadBlancer已经在 https 上获得了请求,并已将其发送到 plain http 上的ServletContainer。在这种情况下,LoadBalancer将 X-SSL-Secure:true 标头发送到ServletContainer,这应该受到尊重。

https 收到请求时,容器还应提供此请求属性:

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

答案 1 :(得分:27)

您无法可靠地依赖端口号 但你可以依赖这个计划:

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

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

我相信无论Tomcat版本

,这都应该有效

答案 2 :(得分:10)

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

答案 3 :(得分:-3)

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