用js获取mac值

刚才看了这个代码,这是获取自身电脑的mac地址(本地mac)。但是无法获取别人的mac地址。需求是外部访问某网站,就能获取访问者的mac地址。

你们后台应该有办法^_^

刚才就是后台看的代码,我不懂java:sob:

我想说,TCP 协议下互联网上的服务器就没法获取客户端的 MAC 啊,根本不会携带过去。除非客户端运行程序取出 MAC 再主动发给服务端。

客户端取出mac再发给服务端,那就应该是我前端做的事情,但是搜了好多js取mac的方法,感觉都不行。有没有解决办法呢?

mac

package com.util.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.servlet.http.HttpServletRequest;

public class IpUtil {
/**
* 获取登录用户IP地址
*
* @param request
* @return
*/
public static 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();
}
if (ip.equals(“0:0:0:0:0:0:0:1”)) {
ip = “本地”;
}
return ip;
}

/**
 * 根据IP地址获取mac地址
 * 
 * @param ipAddress
 *            127.0.0.1
 * @return
 * @throws SocketException
 * @throws UnknownHostException
 */
public static String getLocalMac(String ipAddress) throws SocketException,
		UnknownHostException {
	// TODO Auto-generated method stub
	String str = "";
	String macAddress = "";
	final String LOOPBACK_ADDRESS = "127.0.0.1";
	// 如果为127.0.0.1,则获取本地MAC地址。
	if (LOOPBACK_ADDRESS.equals(ipAddress)) {
		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;
	} else {
		// 获取非本地IP的MAC地址
		try {
			System.out.println(ipAddress);
			Process p = Runtime.getRuntime()
					.exec("nbtstat -A " + ipAddress);
			System.out.println("===process==" + p);
			InputStreamReader ir = new InputStreamReader(p.getInputStream());

			BufferedReader br = new BufferedReader(ir);

			while ((str = br.readLine()) != null) {
				if (str.indexOf("MAC") > 1) {
					macAddress = str.substring(str.indexOf("MAC") + 9,
							str.length());
					macAddress = macAddress.trim();
					System.out.println("macAddress:" + macAddress);
					break;
				}
			}
			p.destroy();
			br.close();
			ir.close();
		} catch (IOException ex) {
		}
		return macAddress;
	}
}

}

试试

浏览器沙盒不可能让你直接访问硬件,更何况是 MAC 这种跟浏览器没关系的信息。只能考虑插件、C 端软件等方式。

还没有找到合适的插件,实在不行弄成c/s结构去做。

试了,这种是通过ip获取mac地址,但是一旦ip变了,mac地址也会发生改变。结果是错误的。

不认为 Chrome 会允许这种能力,你(在浏览器上)的选择大概只有 ActiveX 和 Flash。

但是谷歌还用不了ActiveX,感觉是无解了:sob:而且当用了ActiveX时,就相当于降低了用户的安全等级,前提还是客户浏览器里安装了ActiveX并允许。有好多前提和弊端。

浏览器不提供接口的话,就获取不到。

如果你们需求一定要的话,只能折中:

  1. 写一个程序,不安装不给用,类似百度云的 极速上传插件 那样,其实就是一个普通程序,读大文件的信息,再上传
  2. 用 electron 将网页打包成桌面端应用,已经是桌面端应用,可以随便玩了。

总之,都是需要有一个桌面级程序读取信息,再提供给页面

可以在服务端使用 IPuserAgent 来区分用户吧,或者在网页本身生成 UUID,在访客访问时接口上报来标记身份。
需求是需求,但是怎么实现可以商讨吧。:)

var MACAddr;
var IPAddr;
var DomainAddr;
var sDNSName;
getMac()
function init(){
var service=locator.ConnectServer();
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo,‘Win32_NetworkAdapterConfiguration’);
}
function getMac(){
console.log(unescape(MACAddr));
}

已经和那边沟通了,选择了第二种方法进行折中。感谢你的回复

最后还是做成了桌面端,直接用js获取mac地址感觉无法实现。感觉你的回复

做成桌面端了。直接用js貌似还是不行。只能获取本机的mac不能获取别人的。感谢你的回复。

嗯嗯,能够区分开就好

@sunElyn
我之前做过获取Mac地址的尝试,内网大多数情况下还是没问题的,服务端用个命令可以查到对应IP的Mac地址,但是,如果请求经过代理中转或者路由的话,可能只能得到路由器的mac或者代理服务器的Mac。