不少時候都很難琢磨客戶在想什麼,也許是本身業務經驗不足,也許是客戶要顯示出他在軟件方面也很是的專業。記得之前聽過一個故事,說一個富人想娶個媳婦,而後他比較鐘意的有三個女人,而後就想從三個女人中選一個,他分別給了三個女人各一千塊錢,並對她們說,「我這裏有一個房間,請大家用本身的一千塊錢儘量的將房間填滿」。第一個女人,將1000塊錢都買了棉花,可是這些棉花只填滿了整個房間的三分之一;第二個女人,將1000塊錢都買了氣球,可是這些氣球也只填滿了整個房間的三分之二;第三個女人,花了1塊錢買了一支蠟燭,讓蠟燭的光照亮了整個房間。而後……這個富人愉快的娶了其中胸部最大的那個女人。這個故事告訴咱們,有時你根本不知道客戶到底要的是什麼!html
解決安全登陸的問題瀏覽器
去給客戶演示系統,演示完剛開發完的系統之後客戶就將咱們的系統批的遍體鱗傷,這時才知道本身的系統比想象中的更不堪。在如此不堪的系統面前,客戶又提出了一個需求,要限制用戶的登陸機器。補充一下,演示的系統是一個ERP系統,是BS結構的,用Java寫的。客戶要求,要限制可以登陸系統的電腦,須要綁定MAC地址。由於系統裏的數據比較重要,不能讓員工回家登陸系統,所以必需要進行限制。安全
解決思路服務器
這樣的問題,能想到的解決思路只有兩個:微信
一、在EXE文件中嵌入一個瀏覽器控件,瀏覽器中顯示ERP的頁面,EXE獲取MAC地址後提交到服務器。感受這樣先是要處理EXE提交的MAC地址,而後還要和頁面交互,想一想貌似比較複雜,就否掉了。函數
二、寫一個OCX,讓頁面中的JS與OCX進行交互,OCX獲取到MAC地址後,將MAC返回給JS,JS經過DOM操做寫入到對應的表單中,而後和用戶名、密碼一塊兒提交給服務器。感受這個好像實現起來還比較簡單。就這個吧!測試
OCX中獲取MAC地址的關鍵代碼spa
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 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 地址的長度爲 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的方法就留在這裏吧!也許,我之後會用到也說不定呢。
個人微信公衆號:「碼農UP2U」