Java、Go获取HTTP请求源IP的方法

这里写自定义目录标题

Java、Go获取HTTP请求源IP的方法

  • Golang获取Http请求源IP地址
func GetSrcIp(request *http.Request) string {
	var srcIp string
	srcIp = request.Header.Get("x-forwarded-for");
	if srcIp == "" || strings.EqualFold(srcIp, "unknown") {
		srcIp = request.Header.Get("Proxy-Client-IP");
	}
	if srcIp == "" || strings.EqualFold(srcIp, "unknown") {
		srcIp = request.Header.Get("WL-Proxy-Client-IP");
	}
	if srcIp == "" || strings.EqualFold(srcIp, "unknown") {
		srcIp = request.Header.Get("HTTP_CLIENT_IP");
	}
	if srcIp == "" || strings.EqualFold(srcIp, "unknown") {
		srcIp = request.Header.Get("HTTP_X_FORWARDED_FOR");
	}
	if srcIp == "" || strings.EqualFold(srcIp, "unknown") {
		srcIp = request.RemoteAddr	
	}
	if srcIp != "" && !strings.EqualFold(srcIp, "unknown") && strings.Contains(srcIp, ",") {
		str1 := strings.Split(srcIp, ",")
		srcIp = str1[0]
	}
	return srcIp
}
  • Java
public static String getRequestIP(HttpServletRequest request) {
        final String unKnownIP = "unknown";

        String strAddr = null;
        try {
            strAddr = request.getHeader("X-Source-IP");
            log.debug("X-Source-IP strAddr:{}", strAddr);
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("X-Forwarded-For");
            }
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("Proxy-Client-IP");
            }
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("WL-Proxy-Client-IP");
            }

            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("HTTP_CLIENT_IP");
            }
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("HTTP_X_FORWARDED_FOR");
            }

            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getRemoteAddr();
                if ("127.0.0.1".equals(strAddr)) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = InetAddress.getLocalHost();
                    strAddr = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if (strAddr != null && strAddr.length() > 15) { // "***.***.***.***".length()
                if (strAddr.indexOf(",") > 0) {
                    strAddr = strAddr.substring(0, strAddr.indexOf(","));
                }
            }
        } catch (TokenGenerationException | UnknownHostException e ) {
            throw new TokenGenerationException(ErrorInfo.GET_HTTP_REQUEST_IP_FAILED.getChMessage(), e);
        }

        return strAddr;
    }

IPUtils

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Description: 获取源ip地址
 */
@Slf4j
public class IpUtils {

    public static final String LOOP_BACK_IP = "127.0.0.1";
    public static final String IPV4 = "^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}" +
            "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$";
    public static final String IPV6 =
                // 8组,无缩减 或 7组::
                "(^([0-9a-fA-F]{1,4}:){7}(:|([0-9a-fA-F]{1,4}))$)" +
                        // 6组::0-1组
                        "|(^([0-9a-fA-F]{1,4}:){6}:([0-9a-fA-F]{1,4}){0,1}$)" +
                        // 5组::0-2组
                        "|(^([0-9a-fA-F]{1,4}:){5}(:|(:[0-9a-fA-F]{1,4}){0,2})$)" +
                        // 4组::0-3组
                        "|(^([0-9a-fA-F]{1,4}:){4}(:|(:[0-9a-fA-F]{1,4}){0,3})$)" +
                        // 3组::0-4组
                        "|(^([0-9a-fA-F]{1,4}:){3}(:|(:[0-9a-fA-F]{1,4}){0,4})$)" +
                        // 2组::0-5组
                        "|(^([0-9a-fA-F]{1,4}:){2}(:|(:[0-9a-fA-F]{1,4}){0,5})$)" +
                        // 0-1组::0-7组
                        "|(^([0-9a-fA-F]{1,4}){0,1}:(:|(:[0-9a-fA-F]{1,4}){0,7})$)";

    public static String getRequestIP(HttpServletRequest request) {
        final String unKnownIP = "unknown";

        String strAddr = null;
        try {
            strAddr = request.getHeader("X-Source-IP");
            log.debug("X-Source-IP strAddr:{}", strAddr);
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("X-Forwarded-For");
            }
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("Proxy-Client-IP");
            }
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("WL-Proxy-Client-IP");
            }

            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("HTTP_CLIENT_IP");
            }
            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getHeader("HTTP_X_FORWARDED_FOR");
            }

            if (strAddr == null || strAddr.length() == 0 || unKnownIP.equalsIgnoreCase(strAddr)) {
                strAddr = request.getRemoteAddr();
                if (LOOP_BACK_IP.equals(strAddr)) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = InetAddress.getLocalHost();
                    strAddr = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if (strAddr != null && strAddr.length() > 15) { // "***.***.***.***".length()
                if (strAddr.indexOf(",") > 0) {
                    strAddr = strAddr.substring(0, strAddr.indexOf(","));
                }
            }
        } catch (TokenGenerationException | UnknownHostException e ) {
            throw new TokenGenerationException(ErrorInfo.GET_HTTP_REQUEST_IP_FAILED.getChMessage(), e);
        }

        return strAddr;
    }

    public static boolean checkIpAddr(String ipStr){
        if (StringUtils.isBlank(ipStr)) {
            return ConstantCommons.FALSE;
        }
        // ipv4 或 ipv6
        if (isIPV4(ipStr) || isIPV6(ipStr)) {
            return ConstantCommons.TRUE;
        }
        return ConstantCommons.FALSE;
    }

    public static boolean isIpArea(String ipStr) {
        // 判断当前ip是不是ip段,仅支持ipv4
        String[] split = ipStr.split("/");
        if (split.length == ConstantCommons.INT_TWO) {
            if (!isIPV4(split[0])) {
                return ConstantCommons.FALSE;
            }
            if (StringUtils.isNumeric(split[1])
                    && Integer.valueOf(split[1]) >= 16
                    && Integer.valueOf(split[1]) <= 30) {
                return ConstantCommons.TRUE;
            }
        }
        return ConstantCommons.FALSE;
    }


    public static boolean isIPV4(String addr) {
        if (addr.length() < 7) {
            return false;
        }
        // 判断IP格式和范围
        Pattern pat = Pattern.compile(IPV4);
        Matcher mat = pat.matcher(addr);
        boolean ipAddress = mat.find();
        return ipAddress;
    }


    public static boolean isIPV6(String addr) {
        if (addr.length() < 15) {
            return false;
        }
        // 判断IP格式和范围
        Pattern pat = Pattern.compile(IPV6);
        Matcher mat = pat.matcher(addr);
        boolean ipAddress = mat.find();
        return ipAddress;
    }

    /**
     * 判断ip是否在指定网段
     *
     * @param ip
     * @return
     */
    public static boolean ipIsInNet(String ip, String ipArea) {
        if (LOOP_BACK_IP.equals(ip)) {
            return true;
        }

        String[] ips = ip.split("\\.");
        // ip地址的十进制值
        int ipAddress = (Integer.parseInt(ips[0]) << 24)
                | (Integer.parseInt(ips[1]) << 16)
                | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
        // 掩码(0-32)
        int type = Integer.parseInt(ipArea.replaceAll(".*/", ""));
        // 匹配的位数为32 - type位(16进制的1)
        int mask = 0xFFFFFFFF << (32 - type);
        String cidrIp = ipArea.replaceAll("/.*", "");
        // 网段ip十进制
        String[] cidrIps = cidrIp.split("\\.");
        int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
                | (Integer.parseInt(cidrIps[1]) << 16)
                | (Integer.parseInt(cidrIps[2]) << 8)
                | Integer.parseInt(cidrIps[3]);

        if ((ipAddress & mask) == (cidrIpAddr & mask)){
            return true;
        }
        return false;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值