java 代码如何获取用户的硬件信息,就是判断用户是不是用同一个手机或者同一台电脑或者同一个ipad访问了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 代码如何获取用户的硬件信息,就是判断用户是不是用同一个手机或者同一台电脑或者同一个ipad访问了相关的知识,希望对你有一定的参考价值。

java 代码如何获取用户的硬件信息,就是判断用户是否用同一个手机或者同一台电脑或者同一个ipad访问了我的web网页

不可以,这属于用户隐私信息,再说如果可以的话,那我们的电脑你不觉得很危险吗?随便一个网页都可以看到你的硬件信息,很危险的。我原来遇到过用户想这样搞,最后跟用户谈,不能实现,修改成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记录,那你有需要重新发送激活码。

参考技术A 你的意思是获取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;
追问

我在本机上试了一下你的代码 返回ERROR! 这段代码不能直接使用吗

参考技术B 当用户登录进来时,把用户信息放入session中,对用户的每次行为都用一个计数器来记住,以此来达到限制用户操作的次数。追问

我不是要限制用户,而是限制硬件设备,一个账号用同一个手机登陆多少次看到的都是相同的激活码,用同一个电脑看到的也是同一个激活码,我的意思是类似于ip那种,有什么属性可以标识一个硬件设备,服务器发现同一个硬件设备发来请求就把上次给它发的激活码再发一遍

追答

这个还不容易。在他用手机或者电脑第一次登录进来时,你在本地写个加密文件或者或者用session记录下来,下次登录时,如果有这个标识符,你就的服务器就自动把已经保存在数据库的激活码发过去就好了。至于硬件设备嘛,你想想,比如手机:一万多人都是用三星i9300,你的程序最多是能获取到这个信息,而且手机的ip地址都是动态的,用户一会儿用wifi上,一会儿用3G、2G,所以对于手机用户,你肯定是无法固定通过人家的硬件设备来限制了。而至于个人的PC电脑,你想获取什么硬件设备信息?人家的是组装的,而且IP地址在路由器上很多也是动态分配的,所以用户每次向你的服务器携带他的IP“地址+硬件设备信息”一起发过去给你,每次都是不同。

你的服务器要想知道是不是同一台设备,只能是通过在本地后台写入段监控进程或者文件,然后下一次用户登录时,通过本地的标识来判断该用户是不是已经存在了。这个就容易控制了。如果那台设备上没这个标识符,就是新的请求。

参考技术C 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追问

我用你这个试过了,两台电脑居然获得相同的东西 你确定你这获得的是mac地址?

追答

我当然确定,你用的什么系统,如果是windows,用ipconfig /all 查出你本机的mac 然后比对一下,在我这没有问题

追问

好吧,我要的不是本机的mac 我的需求是访问我网站的用户的mac地址

如何判断Android设备是真机还是模拟器

现在的模拟器的功能太强大,从蓝牙,传感器等配件到IMEI,Mac,以及手机硬件信息什么都可以模拟
为了防止用户利用模拟器模仿真机进行刷单,刷流量等恶意操作
需要获取设备返回的一些信息来鉴别设备的真伪。
下面是整理的模拟器和真机的区别
虽然大部分都可以模仿,伪造,但是如果综合所有维度来监控,应该不存在太大问题。

一,native方式。
通过c代码读取设备中的配置和硬件相关信息。

1,diskstats
获取闪存的分区状态信息。
int fd = open(“/proc/diskstats”, O_RDONLY);
bytes = read(fd, buf, bytes);
区别:真机下都有mmcblk0分区,但是模拟器没有分区信息。

2,mac地址。
通过socket和ioctl读取mac地址。
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
ioctl(sockfd, SIOCGIFCONF, (char*)&ifc);
ioctl(sockfd, SIOCGIFADDR, &ifr[i])
ioctl(sockfd, SIOCGIFHWADDR, (char*)&ifr[i])

区别:真机可以获取wlan0的ip和mac地址,模拟器只能获取eth0的ip和mac地址;

3,有用的prop信息。
__system_property_get(key, buf);
区别: 模拟器没有ro.boot.serialno和ro.serialno属性,真机中为机器序列号。
模拟器 ro.hardware属性为goldfish,真机为各自的型号。

4,cpu信息。
int fd = open(“/proc/cpuinfo”, O_RDONLY);
bytes = read(fd, buf, bytes);
区别:模拟器中cpuinfo的硬件为Goldfish。

5,drivers
int fd = open(“/proc/tty/drivers”, O_RDONLY);
区别:模拟器中包含goldfish的驱动

6,模拟器特有文件。
int fd = open(“/dev/socket/qemud”, O_RDONLY);
int fd = open(“/dev/qemu_pipe”, O_RDONLY);
区别:模拟器专有的文件,真机中没有。

二,传统的方式:
通过Java层的代码获取,可以有以下方式:

1,IMEI和IMSI
IMEI 移动设备国际身份码。
IMSI IMSI国际移动用户识别码,储存在SIM卡中
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String imsi = tm.getSubscriberId();

设备1:354273055927169 / null(无卡)
设备2:862966024243759 / 460011040618938
模拟器:000000000000000 / 310260000000000

2,Serial序列号
String serial = android.os.Build.SERIAL;

设备1:4df78680771b117b
设备2:OBAI5HDQZPDIRCQG
模拟器:unknown

3,android_id
String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
设备和模拟器都有,16位。

4,Mac地址
WifiManager wifimanage=(WifiManager)getSystemService(Context.WIFI_SERVICE); WifiInfo wifiinfo= wifimanage.getConnectionInfo();
设备1:88:32:9b:1e:49:20
设备2:f8:a4:5f:fd:56:17
模拟器:null
转载自:

https://my.oschina.net/mastere/blog/424221
参考技术A 模拟器是能改变屏幕分辨率的,不是固定大小,不过开发时,最好能用真机测试,至于自适应,只要把不同分辨率的图片放入相应的drawable文件夹下就行啦,然后再layout中都用dp做单位,不要用px. 参考技术B 恩。现在需要转换IP来操作
去下个IP软件。。兔~子IP。。就可以了
直接在官网下的哟。
参考技术C 可以试试用兔子...IP修改器
可随意选择全国800多个城市IP线路连接
支持单页面,单窗口,单IP
连上之后IP地址自动发生改变,动态IP静态IP都支持
手机电脑模拟器虚拟机都可以用

以上是关于java 代码如何获取用户的硬件信息,就是判断用户是不是用同一个手机或者同一台电脑或者同一个ipad访问了的主要内容,如果未能解决你的问题,请参考以下文章

java里面如何在用户登录管理页面时判断用户是不是登录

java如何获取Linux操作系统下的硬件信息

java web 验证用户是不是已登录都有哪些方式。

如何判断Android设备是真机还是模拟器

java如何获得客户端域用户名和域用户所在的域的名称

关于java获取登录用户id的问题