2011-11-20 11 views
54

私はJavaでサーブレットを作成しました。そのサーブレットへのリクエストがHTTPまたはHTTPSを使用して実行されたかどうかを知りたいと思います。サーブレットへのリクエストがHTTPまたはHTTPSを使用して実行されたかどうかをどのように知ることができますか?

私はrequest.getProtocol()を使用できると思っていましたが、両方の方法でHTTP/1.1を返します。

アイデア?

答えて

83

HttpSerlvetRequest.isSecure(の動作するはずと信じて)が答えです。 ServletContainerは、次の場合にtrueを返す責任があります。

  • ServletContainer自身がhttpsで要求を受け入れることができる場合。
  • ServletContainerの前にLoadBalancerがある場合。そして、LoadBlancerはhttpsでリクエストを受け取り、plainのhttp://のServletContainerにそれをディスパッチしました。この場合、LoadBalancerはServletContainerにX-SSL-Secure:trueヘッダーを送信します。

コンテナは、リクエストが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-Protocolを追加しています。カスタムヘッダーに置き換えることもできます。 –

10

isSecure。継承されたメソッドを必ず確認してください。

-3

httpsとhttpは異なるポートで実行されます。したがって、リクエストからポートを取得し、要求がどのポートから来たのかを知ることができ、プロトコルを知ることができます。 int port = request.getServerPort();

+4

@Krishnanのポート番号は任意です...私は44でHTTPを実行できます3およびHTTPS on 80またはそれらの任意の組み合わせ。 – hd1

23

ポート番号は信頼できるものではありません。
しかし、あなたはスキームに依存することができます:それはhttpsであるかどうかを確認するためにrequest.getScheme()

使用。

これは安全な接続です。

私は、これは関係なく、Tomcatのバージョン

+1

isSecureは少なくとも[1.2](http://download.oracle.com/javaee/1.2.1/api/javax/servlet/ServletRequest.html#isSecure%28%29)に戻り、Tomcat固有ではありません。 –

関連する問題