很多時(shí)候都很難琢磨客戶在想什么,也許是自己業(yè)務(wù)經(jīng)驗(yàn)不足,也許是客戶要顯示出他在軟件方面也非常的專業(yè)。記得以前聽(tīng)過(guò)一個(gè)故事,說(shuō)一個(gè)富人想娶個(gè)媳婦,然后他比較鐘意的有三個(gè)女人,然后就想從三個(gè)女人中選一個(gè),他分別給了三個(gè)女人各一千塊錢(qián),并對(duì)她們說(shuō),“我這里有一個(gè)房間,請(qǐng)你們用自己的一千塊錢(qián)盡可能的將房間填滿”。第一個(gè)女人,將1000塊錢(qián)都買(mǎi)了棉花,但是這些棉花只填滿了整個(gè)房間的三分之一;第二個(gè)女人,將1000塊錢(qián)都買(mǎi)了氣球,但是這些氣球也只填滿了整個(gè)房間的三分之二;第三個(gè)女人,花了1塊錢(qián)買(mǎi)了一支蠟燭,讓蠟燭的光照亮了整個(gè)房間。然后……這個(gè)富人愉快的娶了其中胸部最大的那個(gè)女人。這個(gè)故事告訴我們,有時(shí)你根本不知道客戶到底要的是什么!
?
解決安全登錄的問(wèn)題
去給客戶演示系統(tǒng),演示完剛開(kāi)發(fā)完的系統(tǒng)以后客戶就將我們的系統(tǒng)批的遍體鱗傷,這時(shí)才知道自己的系統(tǒng)比想象中的更不堪。在如此不堪的系統(tǒng)面前,客戶又提出了一個(gè)需求,要限制用戶的登錄機(jī)器。補(bǔ)充一下,演示的系統(tǒng)是一個(gè)ERP系統(tǒng),是BS結(jié)構(gòu)的,用Java寫(xiě)的。客戶要求,要限制能夠登錄系統(tǒng)的電腦,需要綁定MAC地址。因?yàn)橄到y(tǒng)里的數(shù)據(jù)比較重要,不能讓員工回家登錄系統(tǒng),因此必須要進(jìn)行限制。
?
解決思路
這樣的問(wèn)題,能想到的解決思路只有兩個(gè):
1、在EXE文件中嵌入一個(gè)瀏覽器控件,瀏覽器中顯示ERP的頁(yè)面,EXE獲取MAC地址后提交到服務(wù)器。感覺(jué)這樣先是要處理EXE提交的MAC地址,然后還要和頁(yè)面交互,想想貌似比較復(fù)雜,就否掉了。
2、寫(xiě)一個(gè)OCX,讓頁(yè)面中的JS與OCX進(jìn)行交互,OCX獲取到MAC地址后,將MAC返回給JS,JS通過(guò)DOM操作寫(xiě)入到對(duì)應(yīng)的表單中,然后和用戶名、密碼一起提交給服務(wù)器。感覺(jué)這個(gè)好像實(shí)現(xiàn)起來(lái)還比較簡(jiǎn)單。就這個(gè)吧!
?
OCX中獲取MAC地址的關(guān)鍵代碼
OCX中可以直接調(diào)用Windows操作系統(tǒng)的API函數(shù),寫(xiě)起來(lái)也比較簡(jiǎn)單,代碼如下:
1 BSTR CGetMacCtrl::GetMacAddress(void) 2 { 3
AFX_MANAGE_STATE(AfxGetStaticModuleState()); 4 5 CString strResult; 6 7 //
TODO: 在此添加調(diào)度處理程序代碼 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 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 30 for(PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses
!= NULL; pCurrAddresses = pCurrAddresses->Next) 31 { 32 // 確保 MAC 地址的長(zhǎng)度為
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寫(xiě)的ActiveX,編譯生成OCX。
?
在Web中進(jìn)行測(cè)試
在Web中測(cè)試也比較簡(jiǎn)單,通過(guò)clsid引入OCX文件,然后JS調(diào)用OCX文件中的函數(shù),函數(shù)返回MAC地址給JS,JS進(jìn)行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>
通過(guò)object標(biāo)簽引入了OCX文件,定義了id為getmac,然后通過(guò)getmac來(lái)調(diào)用OCX中的函數(shù)GetMacAddress()獲取MAC地址。
?
經(jīng)過(guò)簡(jiǎn)單的測(cè)試還是可以的,然后我整合進(jìn)入了JeeSite系統(tǒng)中(我其他文章說(shuō)過(guò),我們的項(xiàng)目是在JeeSite上做二次開(kāi)發(fā)),測(cè)試以后發(fā)現(xiàn)ERP的頁(yè)面對(duì)IE瀏覽器支持不好。
因?yàn)镺CX只能在IE瀏覽器中使用,結(jié)果這個(gè)方案就放棄了。
后來(lái),找到一個(gè)開(kāi)源的Chrome的插件,也完成MAC地址的獲取,該Chrome插件分為兩部分,一部分是Chrome的插件,另外一個(gè)是EXE文件,該EXE文件也是與插件進(jìn)行通信的,由于該插件不是我寫(xiě)的,我就不往這里放了??傊詈筮€是把客戶端這個(gè)需求解決了。OCX的方法就留在這里吧!也許,我以后會(huì)用到也說(shuō)不定呢。
?
?
我的微信公眾號(hào):“碼農(nóng)UP2U”
熱門(mén)工具 換一換
