package com.common.utils.util;import javax.servlet.http.HttpServletRequest;/** * 常用通用的公用方法 * * @author Forever丶诺 * @data 2019/5/16 19:18 */public class IpUtil { public IpUtil(){} /** * 获取 IP地址 * 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址, * X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址 * * @param request * @return * @author Ms.WenJing */ public static String getIpAddr(HttpServletRequest request) { String unknown = "unknown"; String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { // 若以上方式均为获取到ip则证明获得客户端并没有采用反向代理直接使用getRemoteAddr()获取客户端的ip地址 ip = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ip.split(","); for (final String str : arr) { if (!unknown.equalsIgnoreCase(str)) { ip = str; break; } } return ip; }}