package com.nuvole.util;
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
import java.net.InetAddress;
|
import java.net.NetworkInterface;
|
import java.util.Enumeration;
|
|
public class IPUtil {
|
|
/*
|
* @Author : liu.q [916000612@qq.com]
|
* @Date : 2019-05-11 17:06
|
* @Description :获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址,可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值
|
*/
|
public static String getIpAddr(HttpServletRequest request) {
|
String ip = request.getHeader("x-forwarded-for");
|
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
|
// 多次反向代理后会有多个ip值,第一个ip才是真实ip
|
if (ip.indexOf(",") != -1) {
|
ip = ip.split(",")[0];
|
}
|
}
|
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 = request.getHeader("X-Real-IP");
|
}
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
ip = request.getRemoteAddr();
|
}
|
return ip;
|
}
|
|
|
/**
|
* 获取本地IP地址(局域网)
|
*
|
* @Author: lc
|
* @Date: 2019/11/8 11:59
|
*/
|
public static String getLocalHostIp() {
|
try {
|
InetAddress candidateAddress = null;
|
// 遍历所有的网络接口
|
for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); ) {
|
NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
|
// 在所有的接口下再遍历IP
|
for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) {
|
InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
|
if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
|
if (inetAddr.isSiteLocalAddress()) {
|
// 如果是site-local地址
|
return inetAddr.toString().replace("/", "");
|
} else if (candidateAddress == null) {
|
//site-local类型的地址未被发现,先记录候选地址
|
candidateAddress = inetAddr;
|
}
|
}
|
}
|
}
|
if (candidateAddress != null) {
|
return candidateAddress.toString().replace("/", "");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return "";
|
}
|
}
|