private static final String[] ADDR_HEADER = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "X-Real-IP" }; private static final String NUKNOWN = "unknown"; /** * 獲得真實IP地址。 * 在使用了反向代理時,直接用HttpServletRequest.getRemoteAddr()無法獲取客戶真實的IP地址。 * @param request * @return */ public static String getRemoteAddr(ServletRequest request) { String addr = null; if (request instanceof HttpServletRequest) { HttpServletRequest hsr = (HttpServletRequest) request; for (String header : ADDR_HEADER) { if (StringUtils.isBlank(addr) || NUKNOWN.equalsIgnoreCase(addr)) { addr = hsr.getHeader(header); } else { break; } } } if (StringUtils.isBlank(addr) || NUKNOWN.equalsIgnoreCase(addr)) { addr = request.getRemoteAddr(); } else { // 對於通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按','分割 if (addr != null) { int i = addr.indexOf(","); if (i > 0) { addr = addr.substring(0, i); } } } return addr; }