リバースプロキシソフトウェアが使用される場合、http://192.168.1.110:2046/のURLをhttp://www.xxx.com/のURLに逆プロキシングする場合は、request.getRemoteaddr()メソッドを使用してIPを取得します。 request.getRemoteadDr()メソッドを使用して取得したアドレスは、クライアントの実際のIPではなく、127.0.0.1または192.168.1.110です。
プロキシを通過した後、クライアントとサービスの間に中間レイヤーが追加されるため、サーバーはクライアントのIPを直接取得できず、サーバー側のアプリケーションは転送アドレスを介してクライアントに直接返すことができません。ただし、リクエストを転送するHTTPヘッダー情報では、X-Forwarded-For情報が追加されています。元のクライアントIPアドレスと、元のクライアントが要求したサーバーアドレスを追跡するために使用されます。 http://www.xxx.com/index.jsp/にアクセスすると、実際にサーバー上のindex.jspファイルにアクセスするのはブラウザではなく、最初にhttp://192.168にアクセスします。 2046/index.jsp、プロキシサーバーはindex.jspにアクセスするため、index.getRemoteaddr()メソッドを介して取得されますクライアントのIPアドレスではなく、プロキシサーバー。
次に、クライアントの実際のIPアドレスを取得する方法を取得できます。
コードコピーは次のとおりです。
public string getRemortip(httpservletrequestリクエスト){
if(request.getheader( "x-forwarded-for")== null){
return request.getRemoteaddr();
}
return request.getheader( "x-forwarded-for");
}
しかし、http://www.xxx.com/index.jsp/にアクセスすると、上記のように127.0.0.1または192.168.1.110ではなく、返されたIPアドレスは常に不明です。 1.110:2046/index.jsp、クライアントの実際のIPアドレスを返すことができ、検証する方法が書かれています。理由はイカにあります。 squid.conf configuration file fordered_forのfor for for forは、defaulted onに設定されている場合、x-forwarded-for:nowns
したがって、クライアントの実際のIPアドレスを取得する2番目の方法を取得できます。
コードコピーは次のとおりです。
public string getipaddr(httpservletrequestリクエスト){
文字列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の値は複数ありますが、実際のユーザー側の実際の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です