我正在尝试保存 session ,但是当我保存 session 时,下一个请求中的 session 不存在。
当我向 /login
发送 ajax 请求时,我使用 req.session.username
设置 session ,然后发回一个对象,上面写着 {success :真
。然后我刷新页面,如果 session 中存在用户名,我会显示用户页面,否则我会显示主页。
每次我在 /
刷新页面时,它总是显示登录,即使我将请求发送到 /login
并设置了 session 。为什么 session 没有保存?
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 请求时,我得到以下 header :
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'
我不确定为什么要这样做。有什么建议吗?
最佳答案
所以我想出了我的问题,它与服务器无关,而是与 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()
})
关于javascript - 快速 session 不会在页面之间持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45260581/