java 代码如何获取用户的硬件信息,就是判断用户是否用同一个手机或者同一台电脑或者同一个ipad访问了
java代码如何获取用户的硬件信息,就是判断用户是否用同一个手机或者同一台电脑或者同一个ipad访问了我的web网页...
java 代码如何获取用户的硬件信息,就是判断用户是否用同一个手机或者同一台电脑或者同一个ipad访问了我的web网页
展开
4个回答
展开全部
不可以,这属于用户隐私信息,再说如果可以的话,那我们的电脑你不觉得很危险吗?随便一个网页都可以看到你的硬件信息,很危险的。我原来遇到过用户想这样搞,最后跟用户谈,不能实现,修改成cookie验证了,像韩家_四少发的代码,只可以在特定环境下使用,还需要考虑网络状态,而且nbtstat -a是windows 下面的命令,根本不可行。
追问
用cookie可以实现这种需求吗?首次收到请求new一个cookie,name假如等于1,再次受到请求查找cookie有没有对应的name=1的值。这样每个name=1的值作为每台硬件设备访问的唯一标识,每台硬件设备访问都先验证cookie中有没有name=1的,有则发给他跟以前访问相同的激活码,没有就new一个,是这样吗
追答
基本是这个意思,一台电脑访问你的网站,然后在他的cookie里面查找一个key = "yourkey"的值,拿这个值发送到你的网站后台,去数据库查一下有没有存在,没有的话,可以返回一个你所谓的激活码给他,同时,设置cookie("yourkey", random)(记得设置保存时间),然后还要把这个random存到数据库,以表示这台机器已被授权了。下次访问的时候,这个cookie值就已经存在数据库中了,就不需要再去发送激活码了,但是cookie有个弊端,就是如果用户清除了cookie记录,那你有需要重新发送激活码。
展开全部
你的意思是获取Mac地址么?
先获取ip通过request.getRemoteAddr();
通过ip获取mac
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;
}
先获取ip通过request.getRemoteAddr();
通过ip获取mac
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;
}
追问
我在本机上试了一下你的代码 返回ERROR! 这段代码不能直接使用吗
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当用户登录进来时,把用户信息放入session中,对用户的每次行为都用一个计数器来记住,以此来达到限制用户操作的次数。
追问
我不是要限制用户,而是限制硬件设备,一个账号用同一个手机登陆多少次看到的都是相同的激活码,用同一个电脑看到的也是同一个激活码,我的意思是类似于ip那种,有什么属性可以标识一个硬件设备,服务器发现同一个硬件设备发来请求就把上次给它发的激活码再发一遍
追答
这个还不容易。在他用手机或者电脑第一次登录进来时,你在本地写个加密文件或者或者用session记录下来,下次登录时,如果有这个标识符,你就的服务器就自动把已经保存在数据库的激活码发过去就好了。至于硬件设备嘛,你想想,比如手机:一万多人都是用三星i9300,你的程序最多是能获取到这个信息,而且手机的ip地址都是动态的,用户一会儿用wifi上,一会儿用3G、2G,所以对于手机用户,你肯定是无法固定通过人家的硬件设备来限制了。而至于个人的PC电脑,你想获取什么硬件设备信息?人家的是组装的,而且IP地址在路由器上很多也是动态分配的,所以用户每次向你的服务器携带他的IP“地址+硬件设备信息”一起发过去给你,每次都是不同。
你的服务器要想知道是不是同一台设备,只能是通过在本地后台写入段监控进程或者文件,然后下一次用户登录时,通过本地的标识来判断该用户是不是已经存在了。这个就容易控制了。如果那台设备上没这个标识符,就是新的请求。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public static List<String> getAllMacAddresses()
{
List<String> addresses = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
try
{
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while(networkInterfaces.hasMoreElements())
{
NetworkInterface netInterface = networkInterfaces.nextElement();
byte[] mac = netInterface.getHardwareAddress();
if(mac != null && mac.length != 0)
{
sb.delete(0, sb.length());
for(byte b : mac)
{
String hexString = Integer.toHexString(b & 0xFF);
sb.append((hexString.length() == 1) ? "0" + hexString : hexString);
}
addresses.add(sb.toString());
}
}
}
catch(SocketException e)
{
e.printStackTrace();
}
return addresses;
}
这段代码我测过,可以获取mac
{
List<String> addresses = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
try
{
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while(networkInterfaces.hasMoreElements())
{
NetworkInterface netInterface = networkInterfaces.nextElement();
byte[] mac = netInterface.getHardwareAddress();
if(mac != null && mac.length != 0)
{
sb.delete(0, sb.length());
for(byte b : mac)
{
String hexString = Integer.toHexString(b & 0xFF);
sb.append((hexString.length() == 1) ? "0" + hexString : hexString);
}
addresses.add(sb.toString());
}
}
}
catch(SocketException e)
{
e.printStackTrace();
}
return addresses;
}
这段代码我测过,可以获取mac
更多追问追答
追问
我用你这个试过了,两台电脑居然获得相同的东西 你确定你这获得的是mac地址?
追答
我当然确定,你用的什么系统,如果是windows,用ipconfig /all 查出你本机的mac 然后比对一下,在我这没有问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询