クライアントのIPアドレスを得る
ServletにアクセスしてきたクライアントのIPアドレスを得る方法。
プロキシを介さない場合
ServletRequest#getRemoteAddr()で、アクセスしてきたクライアントのIPアドレスを取得できます。
ServletRequest request = .. 省略 .. // クライアントのIPアドレス( プロキシを介す場合、プロキシのIPアドレス ) String proxyIp = request.getRemoteAddr();
プロキシを介した場合
ServletRequest#getRemoteAddr()は、プロキシサーバーのIPアドレスを返します。また、プロキシサーバーでクライアントIPアドレスを返す設定がされていれば、環境変数で本来のクライアントのIPアドレスが渡されます。これを解析すればとれなくはないです。
- ×送信しない設定の場合、当然送信されない。(社内プロキシなんかではセキュリティ的に普通送信しないよなー。)
- ×プロキシサーバーごとに挙動が異なるため、プロキシごとに解析コードを用意する必要がある。
例えば、squidではHTTP_X_FORWARDED_FOR 環境変数に保存されるので、次のようなコードで取得できます。
ServletRequest request = .. 省略 .. // プロキシを介してアクセスしたクライアントのIPアドレス HttpServletRequest hr = (HttpServletRequest) request; String clientIp = hr.getHeader( "x-forwarded-for" ); // 多段プロキシの場合を考慮していないので注意。
参考: