cookie - node.js 中 session(基于mongodb和express, 并且前后端代码分离,通过http请求连接) 问题
高洛峰
高洛峰 2017-04-17 15:29:04
0
1
491

前言

此项目基于前后端分离, express, mongoose, http通讯, session存储在mongodb中 (下文有源码),
mongodb连接良好

问题

session存储在mongodb中,并且前后端代码分离, 造成 cookie 中的 connect.sid(express-session中默认cookie的name是:connect.sid) 每次请求都发生变化(可能我对cookie的了解不深, 没真正弄懂吧), 这样造成我在登录完成后( login.js ), 设置了了 req.session.current_user = 'ly',并且在当前请求中 console.dir(req.session) 是可以打印出 current_user, 但是当我发起另外一个请求( article.js )时, 发现 console.dir(req.session) 中压根就 不存在 current_user

初步怀疑是 cookie 的域设置的问题(即是在不在当前域名下有效), 我前端的域名为 http://localhost:8080/loginhttp://localhost:8080/article/lists, 后端的域名为 http://localhost:3000/user/loginhttp://localhost:3000/article/lists

请问我的cookie中的 pathdomain 分别设置为什么才是合法的?暂时代码如下:

文档

app.use(session({
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  secret: 'ly',
  resave: false,
  saveUninitialized: true,
  cookie: {
    path: '/',
    domain: 'localhost',
    // secure: false,
    // maxAge: half_hour
    secure: false,
    // expires: false,
    maxAge: null
  }
}))

源码

app.js(入口文件):


import cookieParser from 'cookie-parser'
import session from 'express-session'
const MongoStore = require('connect-mongo')(session)
import mongoose from 'mongoose'

// 支持跨域
app.use(require('cors')())

app.use(cookieParser())

app.use(session({
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  secret: 'ly',
  resave: false,

  // 表示cookie的name,默认cookie的name是:connect.sid
  // name: 'connect.sid',

  saveUninitialized: true,
  cookie: {
    // secure: false,
    // maxAge: half_hour
    
    // 新添加的
    path: '/',
    domain: 'localhost',
    
    secure: false,
    expires: false,
    maxAge: null
  }
}))

login.js:

function login (req, res, next) {
  req.session.current_user = 'ly'

  // 这里可以打印出 current_user: 'ly'
  console.dir(req.session)

  // 输出:
  // Session {
  // cookie:
  // { path: '/',
  //   _expires: null,
  //   originalMaxAge: null,
  //   httpOnly: true,
  //   secure: false },
  // current_user: 'ly' }
}

article.js

function lists (req, res, next) {
  // 这里 current_user 消失了
  console.dir(req.session)

  // 输出:
  // Session {
  // cookie:
  //  { path: '/',
  //    _expires: null,
  //    originalMaxAge: null,
  //    httpOnly: true,
  //    secure: false } }

}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(1)
巴扎黑

“造成 cookie 中的 connect.sid(express-session中默认cookie的name是:connect.sid) 每次请求都发生变化”的原因很可能是因为cookie丢失或过期了。
在这个情景下过期很可能expires和maxage的设置问题。
可以试试根据https://github.com/expressjs/...去配置cookie的行为。

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal