mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	优化IP地址获取到多个的问题
This commit is contained in:
		@@ -4,7 +4,6 @@ import java.net.InetAddress;
 | 
				
			|||||||
import java.net.UnknownHostException;
 | 
					import java.net.UnknownHostException;
 | 
				
			||||||
import javax.servlet.http.HttpServletRequest;
 | 
					import javax.servlet.http.HttpServletRequest;
 | 
				
			||||||
import com.ruoyi.common.utils.StringUtils;
 | 
					import com.ruoyi.common.utils.StringUtils;
 | 
				
			||||||
import com.ruoyi.common.utils.html.EscapeUtil;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 获取IP方法
 | 
					 * 获取IP方法
 | 
				
			||||||
@@ -13,6 +12,12 @@ import com.ruoyi.common.utils.html.EscapeUtil;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
public class IpUtils
 | 
					public class IpUtils
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取客户端IP
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param request 请求对象
 | 
				
			||||||
 | 
					     * @return IP地址
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public static String getIpAddr(HttpServletRequest request)
 | 
					    public static String getIpAddr(HttpServletRequest request)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (request == null)
 | 
					        if (request == null)
 | 
				
			||||||
@@ -41,15 +46,28 @@ public class IpUtils
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            ip = request.getRemoteAddr();
 | 
					            ip = request.getRemoteAddr();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : EscapeUtil.clean(ip);
 | 
					
 | 
				
			||||||
 | 
					        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 检查是否为内部IP地址
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param ip IP地址
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public static boolean internalIp(String ip)
 | 
					    public static boolean internalIp(String ip)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        byte[] addr = textToNumericFormatV4(ip);
 | 
					        byte[] addr = textToNumericFormatV4(ip);
 | 
				
			||||||
        return internalIp(addr) || "127.0.0.1".equals(ip);
 | 
					        return internalIp(addr) || "127.0.0.1".equals(ip);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 检查是否为内部IP地址
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param addr byte地址
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    private static boolean internalIp(byte[] addr)
 | 
					    private static boolean internalIp(byte[] addr)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (StringUtils.isNull(addr) || addr.length < 2)
 | 
					        if (StringUtils.isNull(addr) || addr.length < 2)
 | 
				
			||||||
@@ -110,7 +128,8 @@ public class IpUtils
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                case 1:
 | 
					                case 1:
 | 
				
			||||||
                    l = Long.parseLong(elements[0]);
 | 
					                    l = Long.parseLong(elements[0]);
 | 
				
			||||||
                    if ((l < 0L) || (l > 4294967295L)) {
 | 
					                    if ((l < 0L) || (l > 4294967295L))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
                        return null;
 | 
					                        return null;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
 | 
					                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
 | 
				
			||||||
@@ -120,12 +139,14 @@ public class IpUtils
 | 
				
			|||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case 2:
 | 
					                case 2:
 | 
				
			||||||
                    l = Integer.parseInt(elements[0]);
 | 
					                    l = Integer.parseInt(elements[0]);
 | 
				
			||||||
                    if ((l < 0L) || (l > 255L)) {
 | 
					                    if ((l < 0L) || (l > 255L))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
                        return null;
 | 
					                        return null;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    bytes[0] = (byte) (int) (l & 0xFF);
 | 
					                    bytes[0] = (byte) (int) (l & 0xFF);
 | 
				
			||||||
                    l = Integer.parseInt(elements[1]);
 | 
					                    l = Integer.parseInt(elements[1]);
 | 
				
			||||||
                    if ((l < 0L) || (l > 16777215L)) {
 | 
					                    if ((l < 0L) || (l > 16777215L))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
                        return null;
 | 
					                        return null;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
 | 
					                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
 | 
				
			||||||
@@ -136,13 +157,15 @@ public class IpUtils
 | 
				
			|||||||
                    for (i = 0; i < 2; ++i)
 | 
					                    for (i = 0; i < 2; ++i)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        l = Integer.parseInt(elements[i]);
 | 
					                        l = Integer.parseInt(elements[i]);
 | 
				
			||||||
                        if ((l < 0L) || (l > 255L)) {
 | 
					                        if ((l < 0L) || (l > 255L))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        bytes[i] = (byte) (int) (l & 0xFF);
 | 
					                        bytes[i] = (byte) (int) (l & 0xFF);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    l = Integer.parseInt(elements[2]);
 | 
					                    l = Integer.parseInt(elements[2]);
 | 
				
			||||||
                    if ((l < 0L) || (l > 65535L)) {
 | 
					                    if ((l < 0L) || (l > 65535L))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
                        return null;
 | 
					                        return null;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
 | 
					                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
 | 
				
			||||||
@@ -152,7 +175,8 @@ public class IpUtils
 | 
				
			|||||||
                    for (i = 0; i < 4; ++i)
 | 
					                    for (i = 0; i < 4; ++i)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        l = Integer.parseInt(elements[i]);
 | 
					                        l = Integer.parseInt(elements[i]);
 | 
				
			||||||
                        if ((l < 0L) || (l > 255L)) {
 | 
					                        if ((l < 0L) || (l > 255L))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        bytes[i] = (byte) (int) (l & 0xFF);
 | 
					                        bytes[i] = (byte) (int) (l & 0xFF);
 | 
				
			||||||
@@ -169,6 +193,11 @@ public class IpUtils
 | 
				
			|||||||
        return bytes;
 | 
					        return bytes;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取IP地址
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @return 本地IP地址
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public static String getHostIp()
 | 
					    public static String getHostIp()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        try
 | 
					        try
 | 
				
			||||||
@@ -181,6 +210,11 @@ public class IpUtils
 | 
				
			|||||||
        return "127.0.0.1";
 | 
					        return "127.0.0.1";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取主机名
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @return 本地主机名
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public static String getHostName()
 | 
					    public static String getHostName()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        try
 | 
					        try
 | 
				
			||||||
@@ -192,4 +226,39 @@ public class IpUtils
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return "未知";
 | 
					        return "未知";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 从多级反向代理中获得第一个非unknown IP地址
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param ip 获得的IP地址
 | 
				
			||||||
 | 
					     * @return 第一个非unknown IP地址
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static String getMultistageReverseProxyIp(String ip)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // 多级反向代理检测
 | 
				
			||||||
 | 
					        if (ip != null && ip.indexOf(",") > 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            final String[] ips = ip.trim().split(",");
 | 
				
			||||||
 | 
					            for (String subIp : ips)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (false == isUnknown(subIp))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ip = subIp;
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return ip;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 检测给定字符串是否为未知,多用于检测HTTP请求相关
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param checkString 被检测的字符串
 | 
				
			||||||
 | 
					     * @return 是否未知
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static boolean isUnknown(String checkString)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user