【问题标题】:Redis session is refreshing on every new request from Angular HTTP GET, but NOT from BrowserRedis 会话正在刷新来自 Angular HTTP GET 的每个新请求,但不是来自浏览器
【发布时间】:2020-11-14 01:30:20
【问题描述】:

我用 NodeJS (+ express) 实现了一个 Redis 会话存储。这是会话的代码:

app.use(cookieParser());
const redisClient = redis.createClient(config.redis);
app.use(session({
    secret: 'SomeSecretKey',
    key: 'session_id',
    resave: false,
    saveUninitialized: false,
    cookie: {maxAge: 24 * 60 * 60 * 1000, secure: false},
    store: new redisStore({
            host: config.redis.host,
            port: config.redis.port,
            client: redisClient,
            ttl: 86400
        }
    ),
}));

我的路由 /api/session 在 NodeJS 中如下所示:(我正在操作会话对象并向其附加一些值)

app.get('/api/session', (req, res) => {
    console.log(req.sessionID);
    req.session.test = 42;
    res.end('1');
});

当我通过浏览器访问localhost:3000/api/session 时,我的redis-cli monitor 上会显示以下内容:

正如您在屏幕截图中看到的 - 会话 ID 保持不变。

但是当我通过 Angular HTTP 模块执行 GET 请求时:

然后我的redis-cli monitor 显示以下内容(它为每个请求生成一个新的 sessionID,我无法在会话中存储任何数据):

总结如下:来自浏览器的 GET 请求确实存储了我的会话,但来自 Angular HTTP 模块的 GET 请求不存储我的会话。进一步使用 Angular GET 请求,它不会将 session_id 存储在我的应用程序 cookie 中(当我在 Chrome 中按 F12 时)。

编辑: 当我执行 curl localhost:3000/api/session 时,它的作用与 Angular HTTP 模块相同:每个请求的新会话。我想要一个具有相同 sessionID 的持久会话。

我做错了什么?

提前致谢

【问题讨论】:

    标签: node.js angular session redis


    【解决方案1】:

    对于同样遇到此问题的每个人:经过数小时的阅读,我发现this 线程,用户FlavorScape 在其代码示例末尾发布了他接受的答案并带有提示。以下步骤解决了我的问题:

    1我已将 NodeJS 中的会话更改为以下选项:

    app.use(session({
        secret: 'SomeSecretKey',
        key: 'session_id',
        resave: true,
        saveUninitialized: false,
        cookie: {maxAge: 60000, rolling: true,},
        store: new redisStore({host: config.redis.host, port: config.redis.port, client: redisClient, ttl: 86400}),
    }));
    

    2 将 NodeJS 中的 Access-Control-Allow-Origin 设置为前端应用程序的来源:

    app.use(function (req, res, next) {
        res.header('Access-Control-Allow-Origin', 'http://localhost:4200');
        res.header('Access-Control-Allow-Credentials', true);
        res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        next();
    });
    

    3我猜这是最重要的部分:在您的 Angular 应用程序中,在 GET 选项中设置 withCredentials: true

    getUserSession(): Observable<any> {
      return this.http.get(this.config.ENDPOINT_URL + 'session', {withCredentials: true});
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2018-01-14
      • 2013-08-06
      相关资源
      最近更新 更多