- - PR -
request.getRemoteAddr()について
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-11-23 20:58
サーバ側でアクセスしてきたクライアントのIPを取りたいと思っているのですが
サーバとクライアントの間にルータが挟まっているため request.getRemoteAddr() でIPを取得しようとしてもルータのアドレスを取得してしまい、 困っております。 どなたかお力を貸していただけないでしょうか。 よろしくお願いいたします。 |
|
投稿日時: 2004-11-24 00:11
クライアント/サーバが自作のものであれば、クライアントが自マシンの IP アドレスを送信するように変更する。
ルータに依存しない点で、条件さえ合えばこれが一番確実です。 ルータによっては設定で何とかなるかもしれません。 設定ではダメでも、機種を変えれば対応しているかもしれません。 機種や環境等がまったく書かれていないのでこれ以上のことは何もわかりませんが。 request という変数の型が書かれていないので勝手に J2EE 1.3.1 の javax.servlet.ServletRequest と解釈しますが、もしもこれで合っていれば getRemoteHost() メソッドを試す方法もあります。 うまくするとクライアントのホスト名ないし IP アドレスが得られるかもしれません。 javax.servlet.HttpServletRequest ならば getHeaderNames() でヘッダを調べてクライアントアドレスがないか見てみる方法もありますが、これはサーブレットコンテナに依存します。つまり、コンテナによってはこれが常に null を返すものがあります。 もう少し具体的な環境等が書かれてあると、より現実的な解が得られるかもしれません。 |
|
投稿日時: 2004-11-24 12:45
<%@ page import="java.net.*"%>
<% String ip1 = request.getHeader("x-forwarded-for"); String ip2 = request.getRemoteAddr(); if ( ip1 == null || ip1.length() < 4 ) ip1 = request.getHeader("INTEL_SOURCE_IP"); %> <%=ip1 %> <br> <%=ip2 %> 外部IPと内部IPを取得できます。 ※すべてのサーバで出来るのではない。 ※mod_proxyが起動中のサーバのみ ※HTTPヘッダを確認してから定義して使用 昔、確実に覚えていませんがどこかで聞きました。 |
|
投稿日時: 2004-11-24 14:54
ルータにより単にNATされただけの場合、クライアントのIPアドレス情報はパケットから完全に失われるので、どうがんばってもクライアントのIPアドレスの取得はできません。(そもそもクライアント−ルータ間がIP網かどうかさえ定かではありません)
これが、HTTPを解釈してくれるようなルータ、もしくはProxyの場合であれば、X-Forwarded-ForヘッダやWL_Proxy-Client-IPヘッダとして、クライアントのIPアドレスを載せてくれたりもします。どのような名称のヘッダが付くかはProxy依存となります。 クライアントのIPアドレスを取得するのが必須要件であるにも関わらずHTTPヘッダに手がかりが何もないのであれば、ルータでNATをしないようにできないかどうかを検討してみてください。 ※相手がプライベートアドレスでパケットが送れないためNATする必要がある、ということであれば、ルーティングから見直す必要があります。 [ メッセージ編集済み 編集者: komey 編集日時 2004-11-24 15:24 ] |
|
投稿日時: 2004-11-25 14:36
皆様お返事ありがとうございます。
状況的には クライアント(127.1.1.2) ↓ ルータ(1.1.1.1) ↓ サーバ(Tomcat) でサーバでrequest.getHeader("x-fowarded-for")を取得すると nullが帰ってきてしまいます。 対処方法はあるんでしょうか? |
|
投稿日時: 2004-11-25 14:56
大文字小文字の違いではないでしょうか?
本当にヘッダが送られてきているか確認したければパケットキャプチャを行いましょう。 |
1
