package com.artfess.base.util; import org.apache.commons.lang.StringUtils; import javax.servlet.http.HttpServletRequest; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; /** * IP地址 * * @Author scott * @email jeecgos@163.com * @Date 2019年01月14日 */ public class IPUtils { //private static Logger logger = LoggerFactory.getLogger(IPUtils.class); /** * 获取IP地址 * * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = null; try { ip = request.getHeader("x-forwarded-for"); if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) { int index = ip.indexOf(","); if (index != -1) { return ip.substring(0, index); } else { return ip; } } } } if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } catch (Exception e) { throw new RuntimeException("IPUtils ERROR!"+e.getMessage(),e); } return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip; } /** * 获取服务器地址 * * @return Ip地址 */ public static String getServerIp() { // 获取操作系统类型 String sysType = System.getProperties().getProperty("os.name"); String ip; if (sysType.toLowerCase().startsWith("win")) { // 如果是Windows系统,获取本地IP地址 String localIP = null; try { localIP = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { throw new RuntimeException("IPUtils ERROR!"+e.getMessage(),e); } if (localIP != null) { return localIP; } } else { ip = getIpByEthNum("eth0"); // 兼容Linux if (ip != null) { return ip; } } return "获取服务器IP错误"; } /** * 根据网络接口获取IP地址 * @param ethNum 网络接口名,Linux下是eth0 * @return */ private static String getIpByEthNum(String ethNum) { try { Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); InetAddress ip; while (allNetInterfaces.hasMoreElements()) { NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); if (ethNum.equals(netInterface.getName())) { Enumeration addresses = netInterface.getInetAddresses(); while (addresses.hasMoreElements()) { ip = (InetAddress) addresses.nextElement(); if (ip != null && ip instanceof Inet4Address) { return ip.getHostAddress(); } } } } } catch (SocketException e) { throw new RuntimeException("IPUtils ERROR!"+e.getMessage(),e); } return "获取服务器IP错误"; } // // public static void main(String[] args) { // System.out.println(getServerIp()); // } /** * 将字符串形式IP地址127.0.0.1转换10234564321 * * @param strIP * @return */ public static long ip2Long(String strIP) { long[] ip = new long[4]; // 先找到IP地址字符串中.的位置 int position1 = strIP.indexOf("."); int position2 = strIP.indexOf(".", position1 + 1); int position3 = strIP.indexOf(".", position2 + 1); // 将每个.之间的字符串转换成整型 ip[0] = Long.parseLong(strIP.substring(0, position1)); ip[1] = Long.parseLong(strIP.substring(position1 + 1, position2)); ip[2] = Long.parseLong(strIP.substring(position2 + 1, position3)); ip[3] = Long.parseLong(strIP.substring(position3 + 1)); return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3]; } /** * 将字符串形式IP地址转换long类型 * @param ip * @return */ public static long getIp2long(String ip) { ip = ip.trim(); String[] ips = ip.split("\\."); long ip1 = Integer.parseInt(ips[0]); long ip2 = Integer.parseInt(ips[1]); long ip3 = Integer.parseInt(ips[2]); long ip4 = Integer.parseInt(ips[3]); long ip2long =1L* ip1 * 256 * 256 * 256 + ip2 * 256 * 256 + ip3 * 256 + ip4; return ip2long; } /** * 判断一个ip地址是否在某个ip段范围内 * @param ip * @param startIP * @param endIP * @return */ public static boolean ipExistsInRange(String ip, String startIP, String endIP) { return (getIp2long(startIP) <= getIp2long(ip)) && (getIp2long(ip) <= getIp2long(endIP)); } public static String getLocalMac() throws Exception { InetAddress ia = InetAddress.getLocalHost(); //获取网卡,获取地址 byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress(); System.out.println("mac数组长度:"+mac.length); StringBuffer sb = new StringBuffer(""); for(int i=0; i>> 4) & 0X0F]; ob[1] = Digit[ib & 0X0F]; String s = new String(ob); return s; } public static String getServerMac() throws Exception { // 获取操作系统类型 String sysType = System.getProperties().getProperty("os.name"); String mac="获取服务器MAC错误"; if (sysType.toLowerCase().startsWith("win")) { // 如果是Windows系统,获取本地IP地址 mac = getLocalMac(); } else { mac = getMacAddr(); } return mac; } public static void main(String[] args) throws Exception { //10.10.10.116 是否属于固定格式的IP段10.10.1.00-10.10.255.255 /* String ip="10.10.10.116"; String startIP = "10.10.1.00"; String endIP = "10.10.255.255"; boolean exists = ipExistsInRange(ip,startIP,endIP); System.out.println(ip2Long(ip)); System.out.println(getIp2long(ip));*/ getLocalMac(); } }