package com.vincent.rsf.server.common.utils; 
 | 
  
 | 
import com.vincent.rsf.framework.common.Cools; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import java.net.Inet4Address; 
 | 
import java.net.InetAddress; 
 | 
import java.net.NetworkInterface; 
 | 
import java.util.Enumeration; 
 | 
  
 | 
/** 
 | 
 * Created by vincent on 2020/8/6 
 | 
 */ 
 | 
@Slf4j 
 | 
public class IpTools { 
 | 
  
 | 
    public static String gainRealIp(HttpServletRequest request) { 
 | 
        String ipAddress = ""; 
 | 
        try { 
 | 
            if (request == null) { 
 | 
                return ipAddress; 
 | 
            } 
 | 
  
 | 
            //排除本地测试 
 | 
            if ("127.0.0.1".equals(request.getServerName()) || "localhost".equals(request.getServerName())) { 
 | 
                ipAddress = "127.0.0.1"; 
 | 
                return ipAddress; 
 | 
            } 
 | 
  
 | 
            ipAddress = request.getRemoteAddr(); 
 | 
            if (Cools.isEmpty(ipAddress)) { 
 | 
                ipAddress = request.getRemoteHost(); 
 | 
            } else { 
 | 
                return ipAddress; 
 | 
            } 
 | 
  
 | 
            if (!Cools.isEmpty(ipAddress)) { 
 | 
                return ipAddress; 
 | 
            } 
 | 
  
 | 
            // 获取真实ip,排除代理ip 
 | 
            ipAddress = request.getHeader("Referer"); 
 | 
  
 | 
            // ipAddress = this.getRequest().getRemoteAddr(); 
 | 
            ipAddress = request.getHeader("X-Forwarded-For"); 
 | 
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { 
 | 
                ipAddress = request.getHeader("Proxy-Client-IP"); 
 | 
            } 
 | 
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { 
 | 
                ipAddress = request.getHeader("WL-Proxy-Client-IP"); 
 | 
            } 
 | 
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { 
 | 
                // 更换niginx代理 
 | 
                // ipAddress = request.getRemoteAddr(); 
 | 
                ipAddress = request.getHeader("X-Real-IP"); 
 | 
                if (ipAddress != null && (ipAddress.equals("" + "") || ipAddress.endsWith("0:0:0:0:0:0:0:1"))) { 
 | 
                    // 根据网卡取本机配置的IP 
 | 
  
 | 
                    // linux下也可以获取本地的ip地址 
 | 
                    Enumeration<?> allNetInterfaces = NetworkInterface.getNetworkInterfaces(); 
 | 
                    InetAddress ip; 
 | 
                    while (allNetInterfaces.hasMoreElements()) { 
 | 
                        NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); 
 | 
                        Enumeration<InetAddress> addresses = netInterface.getInetAddresses(); 
 | 
                        while (addresses.hasMoreElements()) { 
 | 
                            ip = addresses.nextElement(); 
 | 
                            if (ip instanceof Inet4Address) { 
 | 
                                // 获取真实的Ip地址 
 | 
                                ipAddress = ip.getHostAddress(); 
 | 
  
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                } 
 | 
  
 | 
            } 
 | 
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割"***.***.***.***".length()=15 
 | 
            if (ipAddress != null && ipAddress.length() > 15) { 
 | 
  
 | 
                if (ipAddress.indexOf(",") > 0) { 
 | 
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); 
 | 
                } 
 | 
            } 
 | 
  
 | 
        } catch (Exception e) { 
 | 
            log.warn("ip{},解析异常", ipAddress, e); 
 | 
        } 
 | 
        return ipAddress; 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |