0

私の仕事は、クライアントと Web サーバーの間に NAT があるかどうかを判断することです。私はこのアルゴリズムを使用しています:

  1. ユーザーリクエストのウェブページ
  2. JSP コードが実行され、要求されたサイトの IP が取得されます
  3. JSP コードはサーバーの内部 IP を取得します
  4. 2 つの IP を比較し、それらが同じ場合 - NAT がないことを意味します

私の質問は、JSP コードで要求されたサイトの IP アドレスを取得するにはどうすればよいですか? request.getRequestURL() を使用しようとしましたが、サイトの domen の名前が返されました。また、リクエストのヘッダーHostを取得しようとしましたが、どちらも機能しませんでした。さらに、DNS サービスのない特定のサーバーがあるため、DNS 名の IP を取得できません。

または、クライアントとサーバーの間にNATがあるかどうかをどのように判断できますか?

4

2 に答える 2

2

試してみてくださいHttpServletRequest.getRemoteAddr()

説明によると:

要求を送信したクライアントまたは最後のプロキシのインターネット プロトコル (IP) アドレスを返します。HTTP サーブレットの場合、CGI 変数 REMOTE_ADDR の値と同じ。

: これは、クライアントの IP アドレスを取得 (または試行) するだけです。クライアントから要求されたサーバーのものではありません。

于 2012-06-08T11:34:45.213 に答える
0

JSP コードはサーバー上で実行されるため、できません。

JSP によって作成されたページ内の Javascript コードを意味していると思いますが、信頼されていない Javascript がブラウザの IP アドレスまたはホスト名を見つけることは許可されていないと思います。

(javascriptでクライアントのIPアドレスを取得するために使用されるトリックが1つありますが、それにはリモートサーバーにリクエストを送信することが含まれます...そしてあなたの場合、リモートサーバーはNATされたアドレスしか配信できません。別のトリックには、 Javaアプレットですが、それもサンドボックスの制限にぶつかると思います...ユーザーのブラウザがアプレットを信頼していない限り.)

要するに、サーバーがクライアントの IP アドレスが NAT されているかどうかを確認することは、通常は不可能だと思います。


NAT されたアドレスの背後にある真の IP アドレスを見つけた場合、それはおそらく役に立たないことに注意してください。可能性としては、IP アドレスがルーティング可能ではなく (プライベート範囲内にあるか、ファイアウォールの背後にあるため)、パブリック DNS サーバーに名前がありません。

于 2012-06-08T11:35:17.773 に答える