很多时候都很难琢磨客户在想什么,也许是自己业务经验不足,也许是客户要显示出他在软件方面也非常的专业。记得以前听过一个故事,说一个富人想娶个媳妇,然后他比较钟意的有三个女人,然后就想从三个女人中选一个,他分别给了三个女人各一千块钱,并对她们说,“我这里有一个房间,请你们用自己的一千块钱尽可能的将房间填满”。第一个女人,将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函数,写起来也比较简单,代码如下:

 BSTR CGetMacCtrl::GetMacAddress(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; // TODO: 在此添加调度处理程序代码
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
if (pAddresses == NULL)
{
return NULL;
} if(GetAdaptersAddresses(AF_UNSPEC, , NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAddresses);
pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
if (pAddresses == NULL)
{
return NULL;
}
} wchar_t acMAC[] = { }; if(GetAdaptersAddresses(AF_UNSPEC, , NULL, pAddresses, &outBufLen) == NO_ERROR)
{ for(PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses != NULL; pCurrAddresses = pCurrAddresses->Next)
{
// 确保 MAC 地址的长度为 00-00-00-00-00-00
if(pCurrAddresses->PhysicalAddressLength != )
{
continue;
}
wsprintf((LPWSTR)acMAC, _T("%02X-%02X-%02X-%02X-%02X-%02X"),
int (pCurrAddresses->PhysicalAddress[]),
int (pCurrAddresses->PhysicalAddress[]),
int (pCurrAddresses->PhysicalAddress[]),
int (pCurrAddresses->PhysicalAddress[]),
int (pCurrAddresses->PhysicalAddress[]),
int (pCurrAddresses->PhysicalAddress[]));
break;
}
} free(pAddresses);
strResult = acMAC; return strResult.AllocSysString();
}

  代码差不多就这样吧,我用的VS2012写的ActiveX,编译生成OCX。

在Web中进行测试

  在Web中测试也比较简单,通过clsid引入OCX文件,然后JS调用OCX文件中的函数,函数返回MAC地址给JS,JS进行DOM操作,代码如下:

 <!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf8">
<title>获取Mac地址Demo</title>
</head>
<body>
<object id="getmac" classid="clsid:52931A6A-93B4-4750-8FE6-B666E90B1D54"
codebase="'getmac.ocx'" style="display:none"></object> <h1>MAC:</h1>
<span id="mac"></span>
<input type="text" id="macAddress" name="macAddress" value="" />
</body>
<script>
var mac = getmac.GetMacAddress();
document.getElementById("mac").innerHTML = mac;
document.getElementById("macAddress").value = mac;
document.getElementById("macAddress").style.display = '';
</script>
</html>

  通过object标签引入了OCX文件,定义了id为getmac,然后通过getmac来调用OCX中的函数GetMacAddress()获取MAC地址。

  经过简单的测试还是可以的,然后我整合进入了JeeSite系统中(我其他文章说过,我们的项目是在JeeSite上做二次开发),测试以后发现ERP的页面对IE浏览器支持不好。因为OCX只能在IE浏览器中使用,结果这个方案就放弃了。后来,找到一个开源的Chrome的插件,也完成MAC地址的获取,该Chrome插件分为两部分,一部分是Chrome的插件,另外一个是EXE文件,该EXE文件也是与插件进行通信的,由于该插件不是我写的,我就不往这里放了。总之,最后还是把客户端这个需求解决了。OCX的方法就留在这里吧!也许,我以后会用到也说不定呢。


我的微信公众号:“码农UP2U”

在Web中获取MAC地址的更多相关文章

  1. 除了获取 MAC 地址还能干啥

            以前写过一篇<在Web中获取MAC地址>的文章,文章的地址是:https://www.cnblogs.com/tosser/p/9022187.html,我当时使用 OCX ...

  2. php怎么获取mac地址?

    如何用php获取mac地址呢?大家知道mac地址是电脑在全球范围的唯一标识,所以这个就非常实用,比如说要做一个投票功能,那mac地址是必不可少 的,如果单纯的靠ip地址来判断这个肯定是不准确的,水分太 ...

  3. C# 获取MAC地址

    /********************************************************************** * C# 获取MAC地址 * 说明: * 在C#中获取本 ...

  4. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  5. Java -- 获取MAC地址

    啦啦啦 package com.xindatai.common.util; import java.io.InputStream; import java.util.regex.Matcher; im ...

  6. 使用 SendARP 获取 MAC 地址(使用SendARP API函数,很多相关文章)

    ARP 协议地址解析协议(ARP)是通过解析网路层地址来找寻数据链路层地址的一个在网络协议包中极其重要的网络传输协议.ARP 最初在 1982 年的 RFC 826 中提出并纳入互联网标准 STD 3 ...

  7. C#获取MAC地址的几种方法

    首先需要用到的一些方法和类: public enum NCBCONST { NCBNAMSZ = 16, MAX_LANA = 254, NCBENUM = 0x37, NRC_GOODRET = 0 ...

  8. 【转载】获取MAC地址方法大全

    From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情. ...

  9. 【转载】VC获取MAC地址的4种方法

    From:http://blog.csdn.net/pdfmaker/article/details/465748 有需求才有创造,有了问题才会想着去解决,那么我这里的获取MAC地址的第4种方法也是在 ...

随机推荐

  1. (NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3

    在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了. 我只需要再实现一 ...

  2. 朴素贝叶斯分类法 Naive Bayes ---R

    朴素贝叶斯算法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt   勿忘初心  无畏未来 作为一个初学者,水平有限,欢迎交流指正. 朴素贝叶斯分类法 ...

  3. 在Cocos2D中改变动态物体为静态物体

    原文链接,有压缩和简化 1.导入一个新的头文件 首先你要知道,不是所有Chimpunk特性都通过Cocos2d的类暴露出来,比如CCPhysicsNode和CCPhysicsBody.对于一些更高级的 ...

  4. Django访问量和页面点击数统计

    http://blog.csdn.net/pipisorry/article/details/47396311 下面是在模板中做一个简单的页面点击数统计.model阅读量统计.用户访问量统计的方法 简 ...

  5. R--线性回归诊断(二)

    线性回归诊断--R [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt   勿忘初心  无畏未来 作为一个初学者,水平有限,欢迎交流指正. R--线性回 ...

  6. 《java入门第一季》之面向对象(面向对象案例详解)

    通过几个小案例理重新回顾一下前面所写的内容,对面向对象的理解更加深刻的目的: 案例一: /* 需求: 定义一个员工类,自己分析出几个成员, 然后给出成员变量,构造方法,getXxx()/setXxx( ...

  7. Customer Form Issue: Automatic Matching Rule Set Defaults Value AutoRuleSet-1

    In this Document   Symptoms   Changes   Cause   Solution   References APPLIES TO: Oracle Receivables ...

  8. 第一个Polymer应用 - (0)准备工作

    原文链接:  Getting Started - Your first Polymer application翻译时间: 2014年7月5日翻译人员: 铁锚 关于Polymer 的简介,请参考 CSD ...

  9. 设计模式学习--组合模式,c++代码

    下面是组合模式的UML类图: <span style="font-family:Microsoft YaHei;font-size:18px;"><span st ...

  10. 关于SharePoint2007简单随感

    首先,还是要感谢我毕业以后的这第一份正式工作,当然现在也依然在做,带我走进了SharePoint的世界,很奇妙也许是有缘吧,自己不是个努力的人,从面试的时候对Moss这个东西闻所未闻,到现在一知半解, ...