首页 > 解决方案 > 为什么在使用 connect-redis 进行会话管理时,redis 密钥会随着每个请求而不断增加?

问题描述

我正在使用connect-redisv3.x 来管理我的风帆应用程序的会话(使用快速会话)。

一切都按照指南进行设置,并且在前端看到时它可以正常工作,例如当我重新启动服务器时,会话保持不变并且用户已登录。

但是当我检查时,redis-cli我发现每个 http 请求都添加了一个密钥;这是理想的行为吗?当系统扩展时,这将对存储造成很大负担,因为每个请求都会在 redis 中输入。

我不明白这是如何工作的,但我希望当用户登录时,它将存储会话 ID 和 cookie 信息,稍后将用于匹配身份验证信息;无论用户在登录后发出多少请求,它都会使用相同的会话 ID 和 cookie 信息来验证用户。我错了还是我配置错误?

编辑:正如@japrescott 指出的那样,这不是一个理想的行为。我正在添加更多信息以找出问题所在。

更多观察:

我在服务器上多次记录传入请求,我观察到了这一点

//req.session.id
Request#1: c_FfYp3ueX0DsGLC0WSLt
Request#2: c_FfYp3ueX0DsGLC0WSLt
//req.session
Request#1 : {"cookie":{"originalMaxAge":2332799997,"expires":"2019-11-22T04:51:24.325Z","httpOnly":true,"path":"/"},"messages":{"success":[],"error":[],"warning":[]},"timezone":"Asia/Calcutta","passport":{"user":"5bc9b1559e47b71da3a61d5a"}}
Request#2 : {"cookie":{"originalMaxAge":2332799997,"expires":"2019-11-22T05:55:24.325Z","httpOnly":true,"path":"/"},"messages":{"success":[],"error":[],"warning":[]},"timezone":"Asia/Calcutta","passport":{"user":"5bc9b1559e47b71da3a61d5a"}}


//req.cookies
{"_ga":"GA1.1.1355665360.1522218513","_hjid":"687665e4-38a4-4355-912c-6045e67acc00","_hjIncludedInSample":"1","io":"J-5QVd1ufdDchLv7AAbA","_gid":"GA1.1.1355665360.1522218513","_gat_UA-73956964-3":"1"}

该问题在 Firefox 上无法重现。redis 中没有额外的条目。但是上面的日志显示了与以上 4 点相同的行为,即使是 Firefox。

在不同操作系统的 Chrome 上可以重现问题。

这就是存储在 redis 中的多个条目(仅显示值)的样子

Saved on Request#1(login) : {\"cookie\":{\"originalMaxAge\":2332799999,\"expires\":\"2019-11-22T05:40:39.017Z\",\"httpOnly\":true,\"path\":\"/\"},\"messages\":{\"success\":[],\"error\":[],\"warning\":[]},\"timezone\":\"Asia/Kolkata\",\"passport\":{\"user\":\"5bc9b1559e47b71da3a61d5a\"}}

Saved on Request#2 : "{\"cookie\":{\"originalMaxAge\":2332800000,\"expires\":\"2019-11-22T05:57:06.225Z\",\"httpOnly\":true,\"path\":\"/\"}}"

Saved on Request#3 : "{\"cookie\":{\"originalMaxAge\":2332800000,\"expires\":\"2019-11-22 T05:57:11.186Z\",\"httpOnly\":true,\"path\":\"/\"}}

这是从客户端接收到服务器的完整请求标头

//Request from Chrome
{
  "host": "localhost:3000",
  "connection": "keep-alive",
  "upgrade-insecure-requests": "1",
  "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
  "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
  "accept-encoding": "gzip, deflate, br",
  "accept-language": "en-US,en;q=0.9",
  "referer": "http://localhost:3000/user/dashboard",
  "cookie": "_ga=GA1.1.1dsd50.15dsfs8814; _hjid=dsf665e4-sfsdd-4dfd-912c-dsfsdfsdf; _hjIncludedInSample=1; io=J-dsfsd; _gid=GA1.1.1dsfdxx.dfdfxxw064; sails.sid=s%3A0TILcXehUjhcPDykvxwopctILbBJB2pe.ts95dvdwV9nktKeCO6%2BNahMuJ3TrWb5h%2F8%2BccRiTap0",
  "sec-fetch-mode": "navigate",
  "sec-fetch-user": "?1",
  "sec-fetch-site": "same-origin",
  "dnt": "1",
}

//Request from Firefox
{
  "host": "localhost:3000",
  "connection": "keep-alive",
  "upgrade-insecure-requests": "1",
  "user-agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0",
  "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  "accept-language": "en-US,en;q=0.5",
  "accept-encoding": "gzip, deflate",
  "referer": "http://localhost:3000/user",
  "cookie": "_ga=GA1.1.1afdsfdscd42.15dsfdsfs28; _hjid=b6asdfsd6-sdfds0df-4sd2b-8sdfd-0sdfsdb99b4; sails.sid=s%3AAUruqhip_1eTZjWq4FHMAajfdFiYpN5o.xjI8R8x04IX8MGIXHCyT1xw9ErvZdsfd2MJciToUE; _gid=GA1.1.7sdfsd86.1dsfsd3207; _hjIncludedInSample=1",
  "if-none-match": "W/\"4a44-s94WDFGXnSin4kOElQeWwQ\""
}

标签: expressredissails.js

解决方案


推荐阅读