JSPでは、クライアントのIPアドレスを取得する方法は次のとおりです。request.getRemoteadDr()は、ほとんどの場合有効です。ただし、Apache、Squid、その他の逆プロキシソフトウェアを渡した後、クライアントの実際のIPアドレスを取得することはできません。 Reverse Proxyソフトウェアを使用する場合、request.getRemoteadDr()メソッドを使用して取得したIPアドレスは、クライアントの実際のIPではなく、127.0.0.1または192.168.1.110です。
プロキシを通過した後、クライアントとサービスの間に中間レイヤーが追加されるため、サーバーはクライアントのIPを直接取得できず、サーバー側のアプリケーションは転送アドレスを介してクライアントに直接返すことができません。ただし、リクエストを転送するHTTPヘッダー情報では、X-Forwarded-For情報が追加されています。元のクライアントIPアドレスと、元のクライアントが要求したサーバーアドレスを追跡するために使用されます。 index.jsp/にアクセスすると、ブラウザが実際にサーバー上のindex.jspファイルにアクセスするわけではありません。代わりに、プロキシサーバーは最初にindex.jspにアクセスし、プロキシサーバーはアクセスした結果をブラウザに返します。プロキシサーバーはindex.jspにアクセスするため、index.getRemoteadDr()メソッドで取得されたIPは、実際にはクライアントのIPアドレスではなく、プロキシサーバーのアドレスです。
したがって、クライアントの実際のIPアドレスを取得する方法を取得できます。
public string getRemortip(httpservletrequest request){if(request.getheader( "x-forwarded-for")== null){return request.getRemoteaddr(); } return request.getheader( "x-forwarded-for"); }方法2クライアントの実際のIPアドレスを取得するには:
public string getipaddr(httpservletrequest request){string ip = request.getheader( "x-forwarded-for"); if(ip == null || ip.length()== 0 || "nown" .equalsignorecase(ip)){ip = request.getheader( "proxy-client-ip"); } if(ip == null || ip.length()== 0 || "nown" .equalsignorecase(ip)){ip = request.getheader( "wl-proxy-client-ip"); } if(ip == null || ip.length()== 0 || "nown" .equalsignorecase(ip)){ip = request.getRemoteaddr(); } IPを返します。 }ただし、マルチレベルのリバースプロキシが渡された場合、X-Forwarded-Forの値は複数ありますが、一連のIP値があります。実際のユーザー側の本当のIPはどれですか?
答えは、X-Forwarded-Forで最初の非知られていない有効なIP文字列を取得することです。のように:
X-forwarded-for:192.168.1.110、192.168.1.120、192.168.1.130、192.168.1.100
ユーザーの実際のIPは:192.168.1.110です