Нello!我正在尝试通过http代表节点来表示客户端连接。现在我有类似的东西:
let names = [ 'john', 'margaret', 'thompson', /* ... tons more ... */ ];
let nextNameInd = 0;
let clientsIndexedByIp = {};
let createNewClient = ip => {
return {
ip,
name: names[nextNameInd++],
numRequests: 0
};
};
require('http').createServer((req, res) => {
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
// If this is a connection we've never seen before, create a client for it
if (!clientsIndexedByIp.hasOwnProperty(ip)) {
clientsIndexedByIp[ip] = createNewClient(ip);
}
let client = clientsIndexedByIp[ip];
client.numRequests++;
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(client));
}).listen(80, '<my public ip>', 511);
我在某些远程服务器上运行此代码,它工作正常;我可以查询该服务器并获得预期的响应。但是我有一个问题:我的笔记本电脑和智能手机都连接到同一个wifi。如果我同时从笔记本电脑和智能手机查询该服务器,则该服务器会认为这两个设备具有相同的IP地址,并且只会为两个设备创建一个“客户端”对象。
例如每个响应的“名称”参数都相同。
在笔记本电脑和智能手机上检查whatsmyip.org会显示相同的IP地址-这使我感到惊讶,因为我对IP的理解被证明是错误的。在此之前,我认为所有设备都具有唯一的IP。
即使两个设备位于同一wifi网络上,我也希望不同的设备与不同的客户端关联。我以为我用来消除设备歧义的数据(仅请求IP(req.headers['x-forwarded-for'] || req.connection.remoteAddress
)就不够用了。
如何区分连接到同一路由器的多个设备? req
对象中是否有多余的数据可以做到这一点?
或者我的笔记本电脑和智能手机都具有相同的IP地址只是一种网络配置错误的情况?
谢谢!
答案 0 :(得分:1)
如果您使用express-fingerprint模块,则此方法适用于大多数用例,例如:
const express = require('express');
const app = express();
const port = 3000;
var Fingerprint = require('express-fingerprint')
app.use(Fingerprint( { parameters:[
Fingerprint.useragent,
Fingerprint.geoip ]
}));
app.get('/test', function(req, res){
console.log("Client fingerprint hash: ", req.fingerprint.hash);
res.send("Your client Id: " + req.fingerprint.hash);
});
app.listen(port);
每个客户端都有一个唯一的哈希,可用于识别它们。值得理解的是,这种方法会有局限性,并且在某些用例中为客户端分配cookie会更好。