这里写自定义目录标题
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;
}
}