72 我用Java写了一个servlet,我想知道对该servlet的请求是使用HTTP还是HTTPS执行的。 我以为我可以用 request.getProtocol()但是两种方法都返回HTTP / 1.1。 有任何想法吗? java servlets ssl https http-protocols — UFK source
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 — 拉梅什PVK source 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版本如何,它都应该起作用 — Cratylus source 1 isSecure至少可以返回1.2,并且不是特定于Tomcat的。 — 马修·弗拉申
-3 https和http在不同的端口上运行。因此,您可以从请求中获取端口,并知道请求来自哪个端口,从而可以了解协议。int port = request.getServerPort(); — 克里山 source 7 @Krishnan端口号是任意的...我可以在443上运行HTTP,在80上运行HTTPS或它们的任意组合。 — hd1 2013年