package cn.timer.api.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.UnknownHostException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import cn.hutool.core.util.StrUtil; import nl.bitwalker.useragentutils.Browser; import nl.bitwalker.useragentutils.OperatingSystem; import nl.bitwalker.useragentutils.UserAgent; public class UserIp { /** * 获取当前网络ip * @param request * @return */ public static String getIpAddr(HttpServletRequest request){ String ipAddress = request.getHeader("x-forwarded-for"); if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("WL-Proxy-Client-IP"); } if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){ //根据网卡取本机配置的IP InetAddress inet=null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ipAddress= inet.getHostAddress(); } } //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15 if(ipAddress.indexOf(",")>0){ ipAddress = ipAddress.substring(0,ipAddress.indexOf(",")); } } return ipAddress; } public static String getClientOS(String userAgent) { String cos = "unknow os"; Pattern p = Pattern.compile(".*(Windows NT 6\\.1).*"); Matcher m = p.matcher(userAgent); if(m.find()) { cos = "Win 7"; return cos; } p = Pattern.compile(".*(Windows NT 5\\.1|Windows XP).*"); m = p.matcher(userAgent); if(m.find()) { cos = "WinXP"; return cos; } p = Pattern.compile(".*(Windows NT 5\\.2).*"); m = p.matcher(userAgent); if(m.find()) { cos = "Win2003"; return cos; } p = Pattern.compile(".*(Win2000|Windows 2000|Windows NT 5\\.0).*"); m = p.matcher(userAgent); if(m.find()) { cos = "Win2000"; return cos; } p = Pattern.compile(".*(Mac|apple|MacOS8).*"); m = p.matcher(userAgent); if(m.find()) { cos = "MAC"; return cos; } p = Pattern.compile(".*(WinNT|Windows NT).*"); m = p.matcher(userAgent); if(m.find()) { cos = "WinNT"; return cos; } p = Pattern.compile(".*Linux.*"); m = p.matcher(userAgent); if(m.find()) { cos = "Linux"; return cos; } p = Pattern.compile(".*(68k|68000).*"); m = p.matcher(userAgent); if(m.find()) { cos = "Mac68k"; return cos; } p = Pattern.compile(".*(9x 4.90|Win9(5|8)|Windows 9(5|8)|95/NT|Win32|32bit).*"); m = p.matcher(userAgent); if(m.find()) { cos = "Win9x"; return cos; } return cos; } /** 2 * 获取服务器IP地址 3 * @return 4 */ public static String getlocahostIp() { InetAddress addr; try { addr = InetAddress.getLocalHost(); String hostAddress = addr.getHostAddress();//获得本机IP return hostAddress; } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static String[] getclientMsg(HttpServletRequest request) throws Exception { String[] strings = new String[3]; UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); Browser browser = userAgent.getBrowser(); System.out.println("浏览器 "+browser); OperatingSystem os = userAgent.getOperatingSystem(); System.out.println("os "+os); String ip = ""; try { ip = InetAddress.getLocalHost().getHostAddress(); //ip 地址 } catch (UnknownHostException e) { e.printStackTrace(); } System.out.println("ip "+ip); strings[0] = browser.toString(); strings[1] = os.toString(); strings[2] = ip; return strings; } public static String[] getOS(HttpServletRequest request) throws Exception { String[] strings = new String[2]; UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); Browser browser = userAgent.getBrowser(); System.out.println("浏览器 "+ browser); OperatingSystem os = userAgent.getOperatingSystem(); System.out.println("os "+os); String ip = ""; ip = InetAddress.getLocalHost().getHostAddress(); //ip 地址 System.out.println("ip "+ip); strings[0] = os.toString(); strings[1] = ip; return strings; } /** * 将IPv4地址转换成字节 * * @param text IPv4地址 * @return byte 字节 */ public static byte[] textToNumericFormatV4(String text) { if (text.length() == 0) { return null; } byte[] bytes = new byte[4]; String[] elements = text.split("\\.", -1); try { long l; int i; switch (elements.length) { case 1: l = Long.parseLong(elements[0]); if ((l < 0L) || (l > 4294967295L)) return null; bytes[0] = (byte) (int) (l >> 24 & 0xFF); bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 2: l = Integer.parseInt(elements[0]); if ((l < 0L) || (l > 255L)) return null; bytes[0] = (byte) (int) (l & 0xFF); l = Integer.parseInt(elements[1]); if ((l < 0L) || (l > 16777215L)) return null; bytes[1] = (byte) (int) (l >> 16 & 0xFF); bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 3: for (i = 0; i < 2; ++i) { l = Integer.parseInt(elements[i]); if ((l < 0L) || (l > 255L)) return null; bytes[i] = (byte) (int) (l & 0xFF); } l = Integer.parseInt(elements[2]); if ((l < 0L) || (l > 65535L)) return null; bytes[2] = (byte) (int) (l >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 4: for (i = 0; i < 4; ++i) { l = Integer.parseInt(elements[i]); if ((l < 0L) || (l > 255L)) return null; bytes[i] = (byte) (int) (l & 0xFF); } break; default: return null; } } catch (NumberFormatException e) { return null; } return bytes; } public static boolean internalIp(String ip) { byte[] addr = textToNumericFormatV4(ip); return internalIp(addr) || "127.0.0.1".equals(ip); } private static boolean internalIp(byte[] addr) { if (StrUtil.isEmptyIfStr(addr) || addr.length < 2) { return true; } final byte b0 = addr[0]; final byte b1 = addr[1]; // 10.x.x.x/8 final byte SECTION_1 = 0x0A; // 172.16.x.x/12 final byte SECTION_2 = (byte) 0xAC; final byte SECTION_3 = (byte) 0x10; final byte SECTION_4 = (byte) 0x1F; // 192.168.x.x/16 final byte SECTION_5 = (byte) 0xC0; final byte SECTION_6 = (byte) 0xA8; switch (b0) { case SECTION_1: return true; case SECTION_2: if (b1 >= SECTION_3 && b1 <= SECTION_4) { return true; } case SECTION_5: switch (b1) { case SECTION_6: return true; } default: return false; } } public static String getMACAddress(String ip) throws Exception { String line = ""; String macAddress = ""; final String MAC_ADDRESS_PREFIX = "MAC Address = "; final String LOOPBACK_ADDRESS = "127.0.0.1"; //如果为127.0.0.1,则获取本地MAC地址。 if (LOOPBACK_ADDRESS.equals(ip)) { InetAddress inetAddress = InetAddress.getLocalHost(); //貌似此方法需要JDK1.6。 byte[] mac = NetworkInterface.getByInetAddress(inetAddress).getHardwareAddress(); //下面代码是把mac地址拼装成String StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { if (i != 0) { sb.append("-"); } //mac[i] & 0xFF 是为了把byte转化为正整数 String s = Integer.toHexString(mac[i] & 0xFF); sb.append(s.length() == 1 ? 0 + s : s); } //把字符串所有小写字母改为大写成为正规的mac地址并返回 macAddress = sb.toString().trim().toUpperCase(); return macAddress; } //获取非本地IP的MAC地址 try { Process p = Runtime.getRuntime().exec("nbtstat -A " + ip); InputStreamReader isr = new InputStreamReader(p.getInputStream()); BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null) { if (line != null) { int index = line.indexOf(MAC_ADDRESS_PREFIX); if (index != -1) { macAddress = line.substring(index + MAC_ADDRESS_PREFIX.length()).trim().toUpperCase(); } } } br.close(); } catch (IOException e) { e.printStackTrace(System.out); } return macAddress; } }