【问题标题】:express session not persisting from page to page快速会话不会在页面之间持续存在
【发布时间】:2017-12-28 20:36:11
【问题描述】:

我正在尝试保存会话,但是当我这样做时,下一个请求中的会话不存在。

当我向/login 发送一个ajax 请求时,我使用req.session.username 设置会话,然后我发回一个显示{success:true} 的对象。然后刷新页面,如果会话中存在用户名,则显示用户页面,否则显示主页。

每次我在/ 刷新页面时,即使我将请求发送到/login 并设置会话,它也总是显示登录。为什么会话没有保存?

let express = require('express')
let sessions = require('express-session')
let bodyParser = require('body-parser')
let app = express()

app.use(sessions({
  secret: 'connection-id',
  resave: true,
  saveUninitialized: true,
  cookie: { maxAge: 60000 }
}))

app.use(bodyParser.json())

app.get('/', (req, res) => {
  if (req.session.username) {
    res.render('pages/home')
  } else {
    res.render('pages/index')
  }
}).post('/login', (req, res) => {
  if (req.xhr) {
    req.session.username = req.body.username
    res.send({ success: true })
  } else {
    res.sendStatus(500)
  }
})

客户端:

let response = await fetch('/login', {
  method: 'post',
  headers: {
    'X-Requested-With': 'XMLHttpRequest',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: new FormData((document.getElementById('login-form'))).toJson()
})

let json = await response.json()
if (json.success) {
  window.location.href = '/'
}

当我发出 Ajax 请求时,我得到以下标头:

set-cookie:connect.sid=s%3At25S_TmjwL6vVkhyJ9LuKIyy4EH1LTcy.Zu4fBpMibfjmMofxQI5K%2FmgAYHWFqQf3x8HPzcQbDH4; Path=/; Expires=Sun, 23 Jul 2017 15:29:26 GMT; HttpOnly

编辑

所以在我的代码中注释掉所有内容并慢慢取消注释并测试这些行之后,我发现这不起作用:

req.session.username = req.body.username // body.username Contains a string

但是,这确实有效:

req.session.username = 'Billy'

我不确定它为什么这样做。有什么建议吗?

【问题讨论】:

  • 您是否保存了 cookie、令牌、无论是在客户端生成的任何内容,是否随每个请求一起发送
  • 不,我不是。我正在使用 fetch 发送信息。
  • 检查控制台查看 cookie 是否已保存/发送。
  • 确实创建了一个名为 connect.sid 的 cookie,并且该值看起来是加密的。我添加了一张图片。
  • 查看 express-session 代码(index.js 第 96 行),它是 cookie 的默认名称。所以是正确的。

标签: javascript node.js session express


【解决方案1】:

所以我发现了我的问题,它与服务器无关,而是 ajax fetch() 请求。

我需要像这样添加选项credentials: 'include'

let response = await fetch('/login', {
  method: 'post',
  credentials: 'include',
  headers: {
    'X-Requested-With': 'XMLHttpRequest',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: new FormData(document.getElementById('login-form')).toJson()
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2014-05-27
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多