在安全性要求較高的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(); }