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

2022-08-31 13:39:17

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

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

有什么想法吗?


答案 1

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

答案 2

您不能可靠地依赖端口号。
但你可以依靠这个方案:

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

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

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