区分的NodeJS http请求; 用同样的公网IP多台设备(Nodejs distinguis

2019-09-30 02:17发布

Н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地址的情况?

谢谢!

Answer 1:

如果您使用的快递指纹模块,这将对于大多数使用情况下工作,例如:

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发送到客户端将工作的一些使用情况较好。



文章来源: Nodejs distinguishing http requests; multiple devices with same public IP