JSF/JAVA 根据IP获取客户端Mac地址
需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户端ip和mac地址的两个方法,留存。?
1.获取客户端ip地址( 这个必须从客户端传到后台):?
?? jsp页面下,很简单,request.getRemoteAddr() ;?
?? 因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换?
- public?String?getMyIP()?{??
- ?????try?{??
- ?????????FacesContext?fc?=?FacesContext.getCurrentInstance();??
- ?????????HttpServletRequest?request?=?(HttpServletRequest)fc.getExternalContext().getRequest();??
- ?????????return?request.getRemoteAddr();??
- ?????}??
- ?????catch?(Exception?e)?{??
- ?????????e.printStackTrace();??
- ?????}??
- ?????return?"";??
- ?}??
2.获取客户端mac地址?
??? 调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:
- public?String?getMACAddress(String?ip){??
- ????????String?str?=?"";??
- ????????String?macAddress?=?"";??
- ????????try?{??
- ????????????Process?p?=?Runtime.getRuntime().exec("nbtstat?-A?"?+?ip);??
- ????????????InputStreamReader?ir?=?new?InputStreamReader(p.getInputStream());??
- ????????????LineNumberReader?input?=?new?LineNumberReader(ir);??
- ????????????for?(int?i?=?1;?i?<?100;?i++)?{??
- ????????????????str?=?input.readLine();??
- ????????????????if?(str?!=?null)?{??
- ????????????????????if?(str.indexOf("MAC?Address")?>?1)?{??
- ????????????????????????macAddress?=?str.substring(str.indexOf("MAC?Address")?+?14,?str.length());??
- ????????????????????????break;??
- ????????????????????}??
- ????????????????}??
- ????????????}??
- ????????}?catch?(IOException?e)?{??
- ????????????e.printStackTrace(System.out);??
- ????????}??
- ????????return?macAddress;??
- ????}??
完整代码:
- import?java.io.IOException;???
- import?java.io.InputStreamReader;???
- import?java.io.LineNumberReader;??
- ??
- public?class?GetMACAddress?{???
- public?String?getMACAddress(String?ipAddress)?{???
- String?str?=?"",?strMAC?=?"",?macAddress?=?"";???
- try?{???
- Process?pp?=?Runtime.getRuntime().exec("nbtstat?-a?"?+?ipAddress);???
- InputStreamReader?ir?=?new?InputStreamReader(pp.getInputStream());???
- LineNumberReader?input?=?new?LineNumberReader(ir);???
- for?(int?i?=?1;?i?<?100;?i++)?{???
- str?=?input.readLine();???
- if?(str?!=?null)?{???
- if?(str.indexOf("MAC?Address")?>?1)?{???
- strMAC?=?str.substring(str.indexOf("MAC?Address")?+?14,???
- str.length());???
- break;???
- }???
- }???
- }???
- }?catch?(IOException?ex)?{???
- return?"Can't?Get?MAC?Address!";???
- }???
- //???
- if?(strMAC.length()?<?17)?{???
- return?"Error!";???
- }??
- ??
- macAddress?=?strMAC.substring(0,?2)?+?":"?+?strMAC.substring(3,?5)???
- +?":"?+?strMAC.substring(6,?8)?+?":"?+?strMAC.substring(9,?11)???
- +?":"?+?strMAC.substring(12,?14)?+?":"???
- +?strMAC.substring(15,?17);???
- //???
- return?macAddress;???
- }??
- ??
- public?static?void?main(String[]?args)?{???
- GetMACAddress?getMACAddress?=?new?GetMACAddress();???
- System.out.println(getMACAddress.getMACAddress("59.78.63.38"));?//获得该ip地址的mac地址???
- }??
- ??
- public?static?String?procAll(String?str)?{???
- return?procStringEnd(procFirstMac(procAddress(str)));???
- }??
- ??
- public?static?String?procAddress(String?str)?{???
- int?indexof?=?str.indexOf("Physical?Address");???
- if?(indexof?>?0)?{???
- return?str.substring(indexof,?str.length());???
- }???
- return?str;???
- }??
- ??
- public?static?String?procFirstMac(String?str)?{???
- int?indexof?=?str.indexOf(":");???
- if?(indexof?>?0)?{???
- return?str.substring(indexof?+?1,?str.length()).trim();???
- }???
- return?str;???
- }??
- ??
- public?static?String?procStringEnd(String?str)?{???
- int?indexof?=?str.indexOf("\r");???
- if?(indexof?>?0)?{???
- return?str.substring(0,?indexof).trim();???
- }???
- return?str;???
- }???
- }??
?
只要写一个servlet来调用这个类的getMACAddress(String netip)方法就可以获得客户端的mac地址了,相信你会写jsp应该对servlet也不陌生吧,在jsp中调用servlet通过session传递返回的mac地址,加以判断就可以了?
mac地址是可以通过注册表修改的,不建议以此来作为限制依据~?
?
补充:?
关于获取IP地址的方式,最近在linux下有一个教训,如果单纯通过InetAddress来获取IP地址,就会出现在不同的机器上IP地址不同的问题。?
InetAddress.getLocalHost().getAddress() 实际上是根据hostname来获取IP地址的。linux系统在刚刚装完默认的hostname是localhost,所以通过上面代码获取到的本机 ip就是127.0.0.1, 相对应,比如我的hostname就是rjlin.atsig.com 返回的ip地址确是atsig.com的地址。暂时采用下面代码来处理,当然还不够灵活:?
public static byte[] getIp() throws UnknownHostException {?
byte[] b = InetAddress.getLocalHost().getAddress();?
Enumeration allNetInterfaces = null;?
try {?
allNetInterfaces = NetworkInterface.getNetworkInterfaces();?
} catch (SocketException e) {?
e.printStackTrace();?
}?
InetAddress ip = null;?
NetworkInterface netInterface = null;?
while (allNetInterfaces.hasMoreElements()) {?
netInterface = (NetworkInterface) allNetInterfaces.nextElement();?
if (netInterface.getName().trim().equals("eth0")){?
Enumeration addresses = netInterface.getInetAddresses();?
while (addresses.hasMoreElements()) {?
ip = (InetAddress) addresses.nextElement();?
}?
break;?
}?
}?
if (ip != null && ip instanceof Inet4Address) {?
return b = ip.getAddress();?
}?
return b;?
}
?
补充:
//?获取真实IP的方法(). ? ? ? ? ? ? ? ? ? ? ? ? ? ?
public String getIpAddr(HttpServletRequest request) {
?????? 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.getRemoteAddr();
?????? }
?????? return ip;
?? }
?
?
?
?
http://justsee.iteye.com/blog/803316
?
?
?
?
