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(Stringnetip)方法就可以获得客户端的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的地址。暂时采用下面代码来处理,当然还不够灵活:

publicstaticbyte[]getIp()throwsUnknownHostException{

byte[]b=InetAddress.getLocalHost().getAddress();

EnumerationallNetInterfaces=null;

try{

allNetInterfaces=NetworkInterface.getNetworkInterfaces();

}catch(SocketExceptione){

e.printStackTrace();

}

InetAddressip=null;

NetworkInterfacenetInterface=null;

while(allNetInterfaces.hasMoreElements()){

netInterface=(NetworkInterface)allNetInterfaces.nextElement();

if(netInterface.getName().trim().equals("eth0")){

Enumerationaddresses=netInterface.getInetAddresses();

while(addresses.hasMoreElements()){

ip=(InetAddress)addresses.nextElement();

}

break;

}

}

if(ip!=null&&ipinstanceofInet4Address){

returnb=ip.getAddress();

}

returnb;

}

补充:

// 获取真实IP的方法().                            

public String getIpAddr(HttpServletRequest request) {

Stringip=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();

}

returnip;

   }

相关推荐