2011-11-20 106 views

回答

83

HttpSerlvetRequest.isSecure()就是答案。 ServletContainer負責在以下情況下返回true:

  • 如果ServletContainer本身可以接受https請求。
  • 如果在ServletContainer前面有LoadBalancer。並且,LoadBlancer已收到請求https並已將其分發到平原http上的ServletContainer。在這種情況下,LoadBalancer會發送X-SSL-Secure:真正的頭部到ServletContainer,這應該被尊重。

容器也應該當HTTPS收到請求該請求屬性可供選擇:

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

您可以請分享您在哪裏獲得'X-SSL-Secure:真實'位?我一直在搜索,我無法找到有關此標題的更多信息。 – Zotov

+0

這不適用於我的環境:Apache 2.4.10作爲前端代理;在java中知道這個請求是不可能的,因爲這個請求是通過http或https到apache完成的。當然,我把它當作http來訪問Java,但我需要知道,前臺代理如何被訪問。 - 事實上,正如@Zotov也提到的那樣:幾乎沒有關於X-SSL-Sercure標題的信息。所以我認爲這不是大致實施?! – badera

+0

標題名稱可能不同,因爲它不是很標準。但是,這裏的概念是代理可以添加關於SSL的標題,服務器可以讀取它們。對於Ex,Nginx添加了X-SSL協議。它也可以用自定義標題代替。 –

10

isSecure。一定要檢查繼承的方法。

-3

https和http在不同的端口上運行。因此,您可以從請求中獲取端口,並知道請求來自哪個端口,以便您可以瞭解該協議。 int port = request.getServerPort();

+4

@Krishnan端口號是任意的......我可以在44上運行HTTP 3和HTTPS 80或其任何組合。 – hd1

23

您無法可靠地依賴於端口號。
但是你可以依賴該方案:

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

如果是,那麼它是安全連接。

我相信不管這應該工作的Tomcat的版本

+1

isSecure至少回到[1.2](http://download.oracle.com/javaee/1.2.1/api/javax/servlet/ServletRequest.html#isSecure%28%29),並且不是Tomcat特定的。 –

相關問題