ip获取工具类



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
* @Title: IPUtil
* @Package com.ds.platform.base.util
* @Description:
* @author ds
* @date 2018/5/28
*/
public class IPUtil {
private final static Logger logger = LoggerFactory.getLogger(IPUtil.class);
public static final Pattern DB_URL_PATTERN = Pattern.compile("jdbc:mysql://(.*):([\\d]*)/(.*)\\?");
/**
* 获得远程用户真实IP地址
* @param request
* @return
*/
public static String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (isIpUnKnown(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (isIpUnKnown(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (isIpUnKnown(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

/**
* 判断是否时unknown
* @param ip
* @return
*/
private static boolean isIpUnKnown(String ip){
return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip);
}

/**
* 获取客户端IP地址
* @param request
* @return
*/
public static String getClientIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if(isIpUnKnown(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_FORWARDED_FOR");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_FORWARDED");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("HTTP_VIA");
}
if(isIpUnKnown(ip)) {
ip = request.getHeader("REMOTE_ADDR");
}
if(isIpUnKnown(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

/**
* 获取本机的IP 地址
* @return
* @throws Exception
*/
public static String getLocalHostLANAddress() {
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.getHostAddress();
} else if (candidateAddress == null) {
// site-local类型的地址未被发现,先记录候选地址
candidateAddress = inetAddr;
}
}
}
}
if (candidateAddress != null) {
return candidateAddress.getHostAddress();
}
// 如果没有发现 non-loopback地址.只能用最次选的方案
InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
return jdkSuppliedAddress.getHostAddress();
} catch (Exception e) {
logger.error("读取本机IP失败,原因:{}",e.getMessage());
}
return "";
}

/**
* 根据mysql的url连接解析出IP 端口 和数据库名称
* @param url
* @return
*/
public static DBConnInfo parseMysqlUrlIP(String url){
DBConnInfo dbConnInfo = new DBConnInfo();
Matcher matcher = DB_URL_PATTERN.matcher(url);
while(matcher.find()){
dbConnInfo.setIp(matcher.group(1));
dbConnInfo.setPort(matcher.group(2));
dbConnInfo.setDbName(matcher.group(3));
}
return dbConnInfo;
}

public static class DBConnInfo{
private String ip;
private String port;
private String dbName;
public DBConnInfo(){}
public DBConnInfo(String ip, String port, String dbName) {
this.ip = ip;
this.port = port;
this.dbName = dbName;
}

public String getIp() {
return ip;
}

public void setIp(String ip) {
this.ip = ip;
}

public String getPort() {
return port;
}

public void setPort(String port) {
this.port = port;
}

public String getDbName() {
return dbName;
}

public void setDbName(String dbName) {
this.dbName = dbName;
}
}
}
posted on 2020-10-12 16:57  博客园197  阅读(145)  评论(0编辑  收藏  举报