我在NodeJS中有我的应用程序。我有n
个带有图片的子页面。我想显示某人访问过指定图像的次数。
我的方法很简单。基本上,每个/get
我都会在数据库中增加一个字段(像伪代码一样对其进行处理):
app.get('/image/:id', (req, res) => {
db.find((elem) => elem.id === req.id).update((elem) => elem.counter++);
})
有效。但是,问题在于唯一性。如果我输入该路线并按reload
十次,则计数器将增加10。这毫无意义。
问题:如何检查指定用户是否已经在该站点上,所以计数器不会增加?
app.get('/image/:id', (req, res) => {
if (user is first time on site) {
db.find((elem) => elem.id === req.id).update((elem) => elem.counter++);
}
})
有一些nodejs库,例如express-limiter
,它们以某种方式存储IP,因此它们不会让某人在指定的时间段内发送相同的请求。我应该这样做并存储IP吗?有没有更简单的方法可以做到这一点?谢谢
答案 0 :(得分:2)
没有完全安全的方法来执行此操作。您可以:
无论使用哪种策略,都需要将该信息存储在持久的位置(例如数据库)中,以便可以获取信息并显示或增加它。
答案 1 :(得分:2)
唯一用户是一个很难解决的问题。 与您的想法相反,即使是大公司(除非他们拥有浏览器)也没有对此100%进行排序,因为不可能完全用当今的技术来解决它。
您应该阅读以下内容:
对于不需要登录的网站,这是通过一堆参数完成的,通常是这些参数的组合。
所有这些组合在一起并以您可以对用户进行假设的方式存储(例如,如果删除cookie的话),就可以得到非常准确的结果,但是所有这些参数都可以整夜更改,您无法真正确定地将该用户检测为已访问过用户。实际上,您需要使用machine_id
+ local_user_id
之类的工具才能执行此操作。正如我所说,浏览器可以做到这一点,但这会在隐私方面引起很多问题,因此我怀疑有人会采用这种方式。
在Google / Apple的情况下,我想如果某个用户正在通过各自的浏览器使用他们的服务,考虑到他们来自浏览器+网站的遥测,他们甚至可以对未认证的用户进行进一步的映射,但这可能是最远的。
永远不要以为用户可以接受此操作。最好通过UI与用户进行检查-cookie同意/用户信息存储是一个非常严肃的主题,您可能会遇到很多麻烦如果您设计不正确的方法。