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

    问题描述 Android手机的关机键损坏,无法开机. 解决方法 将手机通过USB线链接电脑,进入命令行,找到adb命令所在目录,运行如下命令: adb reboot 注意:用这种方法的前提是,如果你当 ...

  2. Chipmunk Rigid Bodies:cpBody

    Chipmunk刚体支持3种不同的类型: Dynamic(动态),Static(静态)以及Kinematic(混合态)刚体.它们拥有不同的行为和性能特征. 动态刚体是默认的刚体类型.它们可以对碰撞做出 ...

  3. 《java入门第一季》之Arrays类前传(排序问题)

    一:冒泡排序 /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 * * 引申: * 利用冒泡排序法,可以获取一个数组的最大值(先冒泡排序,取最后一 ...

  4. android重启代码

    首先新建一个app然后添加 android:sharedUserId="android.uid.system" 再添加重启的权限 <uses-permission andro ...

  5. MIDlet工作原理

    题记 :  现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧! ①: 所有Kjava必须会继承自javax.microedi ...

  6. Linux自动安装JDK的shell脚本

    Linux自动安装JDK的shell脚本 A:本脚本运行的机器,Linux B:待安装JDK的机器, Linux 首先在脚本运行的机器A上确定可以ssh无密码登录到待安装jdk的机器B上,然后就可以在 ...

  7. FFMPEG类库打开流媒体的方法(需要传参数的时候)

    使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数是avformat_open_input(). 其中打开网络流的话,前面要加上函数avformat_network_init(). 一 ...

  8. Xcode出现may cause a leak的解决

    比如如下代码: -(void)performSelector:(SEL)selector onNode:(CCNode *)node withObject:(id)object recursive:( ...

  9. 新版MATERIAL DESIGN 官方动效指南(二)

    继上一篇,本文继续第二部分,从动效的速度.动态持续时间.通用持续时间和缓动曲线4个部分,教你创建平滑一致的Material Design 动效.再系统的干货都比不上官方的动效指南,西瓜就在这,赶紧来捡 ...

  10. LeetCode之“动态规划”:Climbing Stairs

    题目链接 题目要求 You are climbing a stair case. It takes n steps to reach to the top. Each time you can eit ...