獲取訪問者的真實IP地址
阿新 • • 發佈:2018-12-19
import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; /** * <p> * 獲取IP地址類 * </p> * * @author Caratacus */ @NoArgsConstructor(access = AccessLevel.PRIVATE) @Slf4j public abstract class IpUtils { /** * <p> * 獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。 * 但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了,如果通過了多級反向代理的話, * X-Forwarded-For的值並不止一個,而是一串IP值, 究竟哪個才是真正的使用者端的真實IP呢? * 答案是取X-Forwarded-For中第一個非unknown的有效IP字串。 * 例如:X-Forwarded-For:192.168.1.110, 192.168.1.120, * 192.168.1.130, 192.168.1.100 使用者真實IP為: 192.168.1.110 * </p> * * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { // nginx代理獲取的真實使用者ip String ip = request.getHeader("X-Real-IP"); if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } /* 對於通過多個代理的情況, 第一個IP為客戶端真實IP,多個IP按照','分割 "***.***.***.***".length() = 15 */ if (ip != null && ip.length() > 15) { if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } return ip; } }