【问题标题】:Node JS, express-session, remove cookie from client browserNode JS,快速会话,从客户端浏览器中删除 cookie
【发布时间】:2020-02-07 05:07:59
【问题描述】:

我使用的应用程序已经拥有自己的基础架构。任务是防止用户在多个浏览器中登录。我们的应用程序具有单一应用程序架构,因此理想情况下用户应该只在一个浏览器选项卡中工作。我有一个问题。我无法从客户端删除 cookie。

我。简要说明。

应用设置:

服务器:NodeJS 端口:8083

客户端:VueJS 端口:8088

我使用模块express-session 在服务器端初始化会话机制并将cookies 发送到客户端。客户端没有设置cookies。

二。详情:

服务器的根文件是index.js

我在里面做了以下事情:

  1. 插入express模块:
const express = require('express')
  1. 插入cors模块:
const cors = require('cors')
  1. 添加cors设置:
app.use(cors({
    origin: 'http://localhost:8088',
    credentials: true
}))

然后我在 user.js 文件中初始化会话并接收客户端的连接:

  1. 插入express-session模块:
const session = require('express-session')
  1. 通过express.Router()插入路由:
const router = express.Router()
  1. 添加会话设置:
const EIGHT_HOURS  = 1000 * 60 * 60 * 8
const {
    SESS_NAME = 'sid',
    SESS_LIFETIME = EIGHT_HOURS,
    SESS_SECRET = 'test',
    NODE_ENV = 'development'
} = process.env
const IN_PROD = NODE_ENV === 'production'
  1. 初始化会话:
router.use(session({
    name: SESS_NAME,
    resave: false,
    saveUninitialized: false,
    secret: SESS_SECRET,
    cookie: {
        maxAge: SESS_LIFETIME,
        sameSite: false,
        // Must have HTTPS to work 'secret:true'
        secure: IN_PROD
    }
}))
  1. 通过router.post()接收客户端查询

所以我做了什么:

  1. 我使用req.session.destroy 删除会话数据,并希望浏览器注销用户从某些浏览器和cookie 清除。
req.session.destroy(err => {
            if (err) {
                return res.send({ error: 'Logout error' })
            }
            res.clearCookie(SESS_NAME, {path: '/'})
            return res.send({ 'clearSession': 'success' })
        })

不幸的是,没有任何魔法发生

  1. 我阅读了不同的主题。例如,这里 (GitHub) 提供了结论:在res.clearCookie 方法中使用显式 cookie 的路径指示,如上所示。 那没用。

  2. 在 cookie 设置中写入此设置 {path: '/'}。也没有用。

router.use(session({
    name: SESS_NAME,
    resave: false,
    saveUninitialized: false,
    secret: SESS_SECRET,
    cookie: {
    path: '/',
        maxAge: SESS_LIFETIME,
        sameSite: false,
        // Must have HTTPS to work 'secret:true'
        secure: IN_PROD
    }
}))

正如 express-session 文档 (NPM:express-session) 中所写,此路径是 cookie 存储的默认路径。

  1. 在 req.session.destroy 中添加req.session = null
req.session.destroy(err => {
            if (err) {
                return res.send({ error: 'Logout error' })
            }
            req.session = null
            res.clearCookie(SESS_NAME, {path: '/'})
            return res.send({ 'clearSession': 'success' })
        })

没用

  1. delete req.session 也不行。

那么,我该如何解决这个问题呢?我该怎么办?

【问题讨论】:

    标签: node.js express session cookies


    【解决方案1】:

    您是否尝试通过将其设置为 null 来删除确切的 cookie,也就是说您正在处理一个名为 Views 的 cookie,您可以使用 req.session.Views = null 删除该 cookie

    而不是这样做

    req.session.destroy(err => {
                if (err) {
                    return res.send({ error: 'Logout error' })
                }
                req.session = null
                res.clearCookie(SESS_NAME, {path: '/'})
                return res.send({ 'clearSession': 'success' })
            })
    

    你可以做你的会话cookie的名称并将其设置为null,即

    req.session.sid= null
    

    【讨论】:

    • 哦,你能指定我应该在哪里写这个req.session.Views = null 行吗?当您说 Views 时,您是指会话设置中的name: SESS_NAME,即我必须写req.session.SESS_NAME = null
    • 不幸的是,它不起作用。会话不清楚。 req.session.SESS_NAME = null 行仅在会话存储中添加新字段。看起来像这样:Session { cookie: { path: '/', _expires: 2019-10-10T21:08:28.940Z, originalMaxAge: 28800000, httpOnly: true, secure: false, sameSite: false }, userId: 1, blocked: 0, status: 'lambda', SESS_NAME: null }
    • 抱歉,我看到您的会话名称是 'sid' 尝试将其设置为 null,即 req.session.sid = null
    • 再次不幸。在req.session.sid = null 行中显式添加 SESS_NAME 并得到与之前相同的结果。会话存储中的新行:Session { cookie: { path: '/', _expires: 2019-10-10T21:38:26.600Z, originalMaxAge: 28800000, httpOnly: true, secure: false, sameSite: false }, userId: 489, login: 'glebtregubov', password: '10293221', blocked: 0, status: '392', sid: null }
    • 所以一切都没有改变
    【解决方案2】:

    这会从客户端浏览器中删除 cookie

    req.session.destroy(err => {
        res.clearCookie("session-cookie-name", { path: "/" });
      });
    

    【讨论】:

      【解决方案3】:

      添加.send('cleared cookie') 使我的浏览器清除其命名cookie 的缓存。

      const logOutRequest = (req, res) => {
            req.session.destroy((err) => {
               res.clearCookie("notcookie").send('cleared cookie');
            });
          };
      

      【讨论】:

        猜你喜欢
        • 2022-08-21
        • 2014-02-21
        • 1970-01-01
        • 2014-04-16
        • 2012-10-16
        • 2020-01-19
        • 1970-01-01
        • 2010-11-19
        • 2011-02-18
        相关资源
        最近更新 更多