Java伺服器獲取客戶端cpu、主機板相關引數
阿新 • • 發佈:2021-02-04
功能需求為:在使用者登入時,判斷裝置是否已被允許。
剛開始的想法是在伺服器上做操作,就到目前為止也沒想出什麼好點的辦法,於是轉換思路,
把矛頭指向了客戶端。
想到兩種方案,1、通過ActiveX控制元件,2、通過node.js
ActiveX對於瀏覽器的支援,貌似只有ie同核心的瀏覽器才可以,所以選擇放棄。
node.js實現的思路
使用者傳送登入請求–》伺服器呼叫客戶端node.js服務
–》node.js獲取本機引數返回給伺服器–》完成認證
一些具體操作
1.安裝node.js環境,通過命令臺,node --version確認安裝是否正常。
2.獲取cpu和主機板引數的一些cmd命令
# CPU序列號
wmic cpu get processorid
# 主機板序列號
wmic baseboard get serialnumber
# BIOS序列號
wmic bios get serialnumber
這裡我需要的只是這些,如果需要其他的可以自行百度。
3.通過node.js來執行這些命令列程式碼,獲取所需要的資料。
var http = require('http');
var nodeCmd = require('node-cmd');
var cpuId = '';
var mainId = '';
nodeCmd.get(
'wmic cpu get processorid' ,
function(err, data, stderr){
cpuId = data.toUpperCase().substring(11).trim();
}
);
nodeCmd.get(
'wmic baseboard get serialnumber',
function(err, data, stderr){
mainId = data.toUpperCase().substring(12).trim();
}
);
http.createServer(function (request,response) {
response.writeHead(200,{'Content-Type': 'text/plain'});
response.end(cpuId+'&&'+mainId);
}).listen(8888);
這個時候你在命令列控制檯內執行該檔案,通過瀏覽器訪問就能得到你想要得結果了。
擔心自動關閉,或者使用者重啟後服務停止,可以將該程式註冊服務,設定自動啟動即可。
4.關於後臺java程式碼
後臺controller可以通過HttpServletRequest來獲取訪問者的ip,網上相關程式碼很多,可直接複製。
String ip =null;
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip != null) {
//對於通過多個代理的情況,最後IP為客戶端真實IP,多個IP按照','分割
int position = ip.indexOf(",");
if (position > 0) {
ip = ip.substring(0, position);
}
}
獲取到ip後,就可以通過httpClient或者restTemplate來進行服務呼叫。
restTemplate.getForObject("http://" + ip + ":" + nodePort, String.class);
nodePort為客戶端node.js服務的埠號。
獲取到返回資料後,就執行自己的相關認證操作就好了。
大體思路是這樣,如果能用到,細節自己根據業務補充。要是能有不操作服務端裝置的方法話,快快留言~