java服务端获得客户端IP和MAC
来源:互联网 发布:西斯托 fm数据 编辑:程序博客网 时间:2024/06/05 20:22
java服务端获得客户端IP和MAC
1.概述
之前在很多博客上看到关于java服务端获得客户端IP和MAC,其中有关于处理localhost访问IPv6返回ip为0:0:0:0:0:0:0:1的问题,基本都是修改hosts文件,但是我个人按照上述方法处理后没有解决。所以我就采用在java代码里通过判断字符串localhost,将其转成127.0.0.1来解决此问题(可能这样解决不太好)。另外还有获取mac地址时乱码,我个人是通过在命令行里直接执行nbtstat -A [ip],根据获得的内容来进行取值的。
2.详细代码
代码仅供参考,有不足之处,还望不吝指出。
public class IPAndMAC{ public static final String MAC_ADDRESS_PREFIX01 = "MAC Address = "; public static final String MAC_ADDRESS_PREFIX02 = "MAC 地址 = "; public static final String LOOPBACK_ADDRESS = "127.0.0.1"; public static final String IPv6Address = "0:0:0:0:0:0:0:1"; private MapstationScreenAndIP = new HashMap<>(); public Map getStationScreenAndIP() { return stationScreenAndIP; } public void setStationScreenAndIP(Map stationScreenAndIP) { this.stationScreenAndIP = stationScreenAndIP; } /** * 通过HttpServletRequest返回IP地址 * * @param request HttpServletRequest * @return ip String * @throws Exception */ public String getIpAddr(HttpServletRequest request) throws Exception { String ip = request.getHeader("x-forwarded-for"); 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.getRemoteAddr(); } //如果使用localhost访问,对于windows IPv6会返回0:0:0:0:0:0:0:1,将其转为127.0.0.1 if (IPv6Address.equals(ip)) { ip = LOOPBACK_ADDRESS; } return ip; } /** * 通过IP地址获取MAC地址 * * @param ip String,127.0.0.1格式 * @return mac String * @throws Exception */ public String getMACAddress(String ip) throws Exception { String line = ""; String macAddress = ""; //如果为127.0.0.1,则获取本地MAC地址。 if (LOOPBACK_ADDRESS.equals(ip)) { InetAddress inetAddress = InetAddress.getLocalHost(); 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("-"); } 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地址 Process p = Runtime.getRuntime().exec("nbtstat -A " + ip); InputStreamReader isr = new InputStreamReader(p.getInputStream(), "GBK"); BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null) { if (line != null) { //英文环境下,命令行执行nbtstat -A [ip] 返回结果包含"MAC Address =" if (line.contains(MAC_ADDRESS_PREFIX01)) { macAddress = fromLineToGetMacAddress(line, MAC_ADDRESS_PREFIX01); } //中文环境下,命令行执行nbtstat -A [ip] 返回结果包含"MAC 地址 =" if (line.contains(MAC_ADDRESS_PREFIX02)) { macAddress = fromLineToGetMacAddress(line, MAC_ADDRESS_PREFIX02); } } } br.close(); return macAddress; } public String fromLineToGetMacAddress(String line, String MAC_ADDRESS_PREFIX) { String macAddress = ""; int index = line.indexOf(MAC_ADDRESS_PREFIX); if (index != -1) { macAddress = line.substring(index + MAC_ADDRESS_PREFIX.length()).trim().toUpperCase(); } return macAddress; }}
阅读全文
1 0
- java服务端获得客户端IP和MAC
- Java获取访问服务端的客户端IP和MAC地址
- java 获得客户端ip
- HttpRequest获得服务端和客户端的详细信息
- 获得ip和mac地址
- android获得mac和ip
- android获得mac和ip .
- 获得ip和mac地址
- 获得ip和mac地址
- Java获得登录的IP和MAC地址
- 用WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息,所在城市- -
- WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息
- WebService XFire获得访问服务端的客户端IP
- Twisted xmlrpc服务端获得客户端ip的方法
- java客户端与服务端通信Tcp/Ip
- Mac配置openvpn服务端和客户端
- 动态IP转发服务端和客户端脚本
- 客户端获得服务端控件
- (卡特兰数)Train Problem II --HDOJ
- mysql死锁的简单解决
- PAT 1019数字黑洞
- 欢迎使用CSDN-markdown编辑器
- linux内核中request_region()函数详解
- java服务端获得客户端IP和MAC
- HTML5(3)__H5基本语法(上)
- 合并n个已排序的链表
- Golang 解决"no buildable Go source file in"问题
- VS编译时output/Errorlist窗口自动弹出设置
- 抓取豆瓣某本书的评论
- 流程控制语句
- Java中 printf、print、println的区别
- java多线程详解