在Web中获取MAC地址
2018-06-17 20:39:25来源:未知 阅读 ()
很多时候都很难琢磨客户在想什么,也许是自己业务经验不足,也许是客户要显示出他在软件方面也非常的专业。记得以前听过一个故事,说一个富人想娶个媳妇,然后他比较钟意的有三个女人,然后就想从三个女人中选一个,他分别给了三个女人各一千块钱,并对她们说,“我这里有一个房间,请你们用自己的一千块钱尽可能的将房间填满”。第一个女人,将1000块钱都买了棉花,但是这些棉花只填满了整个房间的三分之一;第二个女人,将1000块钱都买了气球,但是这些气球也只填满了整个房间的三分之二;第三个女人,花了1块钱买了一支蜡烛,让蜡烛的光照亮了整个房间。然后……这个富人愉快的娶了其中胸部最大的那个女人。这个故事告诉我们,有时你根本不知道客户到底要的是什么!
解决安全登录的问题
去给客户演示系统,演示完刚开发完的系统以后客户就将我们的系统批的遍体鳞伤,这时才知道自己的系统比想象中的更不堪。在如此不堪的系统面前,客户又提出了一个需求,要限制用户的登录机器。补充一下,演示的系统是一个ERP系统,是BS结构的,用Java写的。客户要求,要限制能够登录系统的电脑,需要绑定MAC地址。因为系统里的数据比较重要,不能让员工回家登录系统,因此必须要进行限制。
解决思路
这样的问题,能想到的解决思路只有两个:
1、在EXE文件中嵌入一个浏览器控件,浏览器中显示ERP的页面,EXE获取MAC地址后提交到服务器。感觉这样先是要处理EXE提交的MAC地址,然后还要和页面交互,想想貌似比较复杂,就否掉了。
2、写一个OCX,让页面中的JS与OCX进行交互,OCX获取到MAC地址后,将MAC返回给JS,JS通过DOM操作写入到对应的表单中,然后和用户名、密码一起提交给服务器。感觉这个好像实现起来还比较简单。就这个吧!
OCX中获取MAC地址的关键代码
OCX中可以直接调用Windows操作系统的API函数,写起来也比较简单,代码如下:
1 BSTR CGetMacCtrl::GetMacAddress(void) 2 { 3 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 4 5 CString strResult; 6 7 // TODO: 在此添加调度处理程序代码 8 ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES); 9 PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen); 10 if (pAddresses == NULL) 11 { 12 return NULL; 13 } 14 // Make an initial call to GetAdaptersAddresses to get the necessary size into the ulOutBufLen variable 15 if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) 16 { 17 free(pAddresses); 18 pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen); 19 if (pAddresses == NULL) 20 { 21 return NULL; 22 } 23 } 24 25 wchar_t acMAC[32] = { 0 }; 26 27 if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == NO_ERROR) 28 { 29 // If successful, output some information from the data we received 30 for(PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses != NULL; pCurrAddresses = pCurrAddresses->Next) 31 { 32 // 确保MAC地址的长度为 00-00-00-00-00-00 33 if(pCurrAddresses->PhysicalAddressLength != 6) 34 { 35 continue; 36 } 37 wsprintf((LPWSTR)acMAC, _T("%02X-%02X-%02X-%02X-%02X-%02X"), 38 int (pCurrAddresses->PhysicalAddress[0]), 39 int (pCurrAddresses->PhysicalAddress[1]), 40 int (pCurrAddresses->PhysicalAddress[2]), 41 int (pCurrAddresses->PhysicalAddress[3]), 42 int (pCurrAddresses->PhysicalAddress[4]), 43 int (pCurrAddresses->PhysicalAddress[5])); 44 break; 45 } 46 } 47 48 free(pAddresses); 49 strResult = acMAC; 50 51 return strResult.AllocSysString(); 52 }
代码差不多就这样吧,我用的VS2012写的ActiveX,编译生成OCX。
在Web中进行测试
在Web中测试也比较简单,通过clsid引入OCX文件,然后JS调用OCX文件中的函数,函数返回MAC地址给JS,JS进行DOM操作,代码如下:
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="utf8"> 5 <title>获取Mac地址Demo</title> 6 </head> 7 <body> 8 <object id="getmac" classid="clsid:52931A6A-93B4-4750-8FE6-B666E90B1D54" 9 codebase="'getmac.ocx'" style="display:none"></object> 10 11 <h1>MAC:</h1> 12 <span id="mac"></span> 13 <input type="text" id="macAddress" name="macAddress" value="" /> 14 </body> 15 <script> 16 var mac = getmac.GetMacAddress(); 17 document.getElementById("mac").innerHTML = mac; 18 document.getElementById("macAddress").value = mac; 19 document.getElementById("macAddress").style.display = ''; 20 </script> 21 </html>
通过object标签引入了OCX文件,定义了id为getmac,然后通过getmac来调用OCX中的函数GetMacAddress()获取MAC地址。
经过简单的测试还是可以的,然后我整合进入了JeeSite系统中(我其他文章说过,我们的项目是在JeeSite上做二次开发),测试以后发现ERP的页面对IE浏览器支持不好。因为OCX只能在IE浏览器中使用,结果这个方案就放弃了。后来,找到一个开源的Chrome的插件,也完成MAC地址的获取,该Chrome插件分为两部分,一部分是Chrome的插件,另外一个是EXE文件,该EXE文件也是与插件进行通信的,由于该插件不是我写的,我就不往这里放了。总之,最后还是把客户端这个需求解决了。OCX的方法就留在这里吧!也许,我以后会用到也说不定呢。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PC微信获取登录二维码 2020-05-18
- C++常见编程--获取当前系统时间 2020-02-25
- 51.Qt-使用ajax获取ashx接口的post数据 2019-12-23
- webbench网站测压工具源码分析 2019-10-12
- LeetCode380 常数时间插入、删除和获取随机元素 2019-09-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash