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
相關文章
- java獲取客戶端ip和macJava客戶端Mac
- 獲取客戶端Mac地址客戶端Mac
- ASP.NET獲取客戶端IP及MAC地址ASP.NET客戶端Mac
- java 獲取客戶端真實ipJava客戶端
- JAVA根據IP地址獲取詳細的地域資訊(轉)Java
- js根據ip地址獲取所在城市JS
- 服務端如何獲取客戶端請求IP地址服務端客戶端
- JS獲取客戶端IP地址與機器名JS客戶端
- pomelo獲取客戶端IP客戶端
- js根據ip地址獲取省份城市的方法JS
- js根據IP地址獲取當前的省市JS
- java獲取ip地址和mac地址JavaMac
- 獲取SQL Server中連線的客戶端IP地址SQLServer客戶端
- 根據ip獲取城市
- java web 通過request獲取客戶端IPJavaWeb客戶端
- js根據ip地址獲取城市地理位置JS
- c# 獲取客戶端IPC#客戶端
- 獲取客戶端真實ip客戶端
- Java 中獲取MAC地址 和IP地址JavaMac
- Spring 客戶端 IP 地址獲取及儲存細節Spring客戶端
- 根據IP獲取國家
- Java面試題-如何獲取客戶端真實IPJava面試題客戶端
- .net 獲取客戶端真實ip客戶端
- 根據 IP 獲取省市名稱
- 根據IP獲取國家省市
- asp.net 獲取客戶端瀏覽器訪問的IP地址ASP.NET客戶端瀏覽器
- 在Intranet中獲得客戶端IP地址客戶端
- ASPNET獲取IP地址 MAC地址Mac
- javascript獲取客戶端ip地址省市和運營商程式碼例項JavaScript客戶端
- Java/JSP獲得客戶端網路卡MAC地址的三種方法解析(附:獲得真實IP)JavaJS客戶端Mac
- 一次獲取客戶端 IP 記錄客戶端
- 伺服器獲取真實客戶端 IP伺服器客戶端
- 【知識積累】伺服器端獲取客戶端的IP地址(當客戶端呼叫由Axis開發的WebService)伺服器客戶端Web
- Java獲取本機名稱、本機MAC地址、IP地址JavaMac
- oracle取客戶端網路卡地址Oracle客戶端
- Java獲取本機ip地址Java
- Nginx 反向代理後如何獲取真實客戶端 IPNginx客戶端
- Silverlight中利用WCF獲取客戶端IP客戶端