在安全性要求較高的web項目中,我們經常有這樣的需求:
黑名單:禁止指定ip訪問。
白名單:允許指定ip訪問。
根據ip追蹤惡意入侵系統者。
在java中我們通常可以這樣獲取客戶端ip地址:
request.getRemoteAddr()
但是這個方法有個弊端,就是如果對方使用了反向代理,那么這個方法獲取到的永遠都是反向代理服務器的ip,而並非用戶的真實ip。這樣也能達到禁止訪問的目的,但是對於已經發生的惡意入侵,我們卻無法定位到真實的用戶主機。
當你遇到類似的問題時,那么下面的代碼就能夠很好的幫助你。
public
static
String getClientIP(HttpServletRequest request) {
String ip = request.getHeader(
"X-Forwarded-For"
);
if
(StringUtils.isNotEmpty(ip) && !
"unKnown"
.equalsIgnoreCase(ip)) {
// 多次反向代理后會有多個ip值,第一個ip才是真實ip
int
index = ip.indexOf(
","
);
if
(index != -
1
) {
return
ip.substring(
0
, index);
}
else
{
return
ip;
}
}
ip = request.getHeader(
"X-Real-IP"
);
if
(StringUtils.isNotEmpty(ip) && !
"unKnown"
.equalsIgnoreCase(ip)) {
return
ip;
}
return
request.getRemoteAddr();
}