73

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

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

有任何想法吗?

4

4 回答 4

102

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

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

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

  • javax.servlet.http.sslsessionid
  • javax.servlet.request.key_size
  • javax.servlet.request.X509Certificate
于 2011-11-21T08:10:02.557 回答
29

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

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

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

我相信无论Tomcat版本如何,这都应该有效

于 2011-11-20T10:43:51.063 回答
11

安全。一定要检查继承的方法。

于 2011-11-20T10:21:45.867 回答
-4

https 和 http 在不同的端口上运行。所以你可以从请求中获取端口,知道请求来自哪个端口,这样你就可以知道协议。int 端口=request.getServerPort();

于 2011-11-20T10:27:44.160 回答