JSP では、クライアントの IP アドレスを取得するメソッドは request.getRemoteAddr() です。このメソッドはほとんどの場合に効果的です。ただし、クライアントの実際の IP アドレスは、Apache や Squid などのリバース プロキシ ソフトウェアを介して取得することはできません。リバース プロキシ ソフトウェアが使用されている場合、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.jsp の request.getRemoteAddr() メソッドを通じて取得される IP は、実際にはクライアントの IP アドレスではなくプロキシ サーバーのアドレスです。
したがって、クライアントの実際の IP アドレスを取得する方法 1 を思いつきます。
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
request.getRemoteAddr() を返します。
}
return request.getHeader("x-forwarded-for");
}
クライアントの実際の IP アドレスを取得する方法 2:
public String getIpAddr(HttpServletRequest request) {
文字列 ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("プロキシ クライアント IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
IPを返します。
}
ただし、マルチレベルのリバース プロキシが渡される場合、X-Forwarded-For の値は 1 つだけではなく、一連の IP 値になります。実際のクライアントの実際の IP はどれですか。
答えは、X-Forwarded-For 内の最初の不明でない有効な IP 文字列を取得することです。のように:
X 転送先: 192.168.1.110、192.168.1.120、192.168.1.130、192.168.1.100
ユーザーの実際の IP は 192.168.1.110 です。