当前位置: 首页 > 知识库问答 >
问题:

在生产中调用destroy时,不会从Mongo存储中删除Express会话数据

巫马松
2023-03-14

我的应用程序的注销功能面临一个问题。

问题

调用req.session.destroy不会仅在生产中从Sessions MongoDB集合中删除会话数据。

请求命中服务器,logout方法运行,destroy函数没有返回错误,在会话上运行console.log显示它是空的,但在页面刷新上用户仍然登录,检查db.sessions.find()显示会话数据未被触及。

我认为子域的设置与此有关,正如预期的那样,本地工作。我只是不明白这是什么,因为应用程序的其他功能良好。

正在使用的密钥包

  • 快速-会话
  • 连接-mongo
  • CORS

该功能在本地运行良好(API和React应用程序都运行在localhost上,只是不同的端口)。

生产设置为

  • API.mydomain.com是带有Express API和Mongo DB的节点服务器。
  • app.mydomain.com是一个向API发送请求的React应用程序。

server.js-重要部分

    //use sessions for tracking logins
var sessionData = {
    name: 'secure_name', // for testing
    secret: 'secure_secret', // for testing
    resave: true,
    rolling: true,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection }),
    cookie: {
        "maxAge": (1000 * 60 * 60 * 7), // 7 days.
        secure: false,
        path: '/',
        domain: process.env.DOMAIN
    }
};

// Setup session with config and make the app use it.
var sessionMiddleware = session(sessionData);
app.use(sessionMiddleware);

...
// User - Logout.
app.get('/api/users/logout', user.logout);

user.logout方法

// Logout user.
exports.logout = (req, res, next) => {

    // Only if there is an active session.
    if (req.session) {

        // delete session object
        req.session.destroy(error => {

            req.session = null;
            if (error) return next(error);

            res.send({ logout: true })
        });
    }
}

反应注销方法请求

        // Logout - end this user session.
    @action logout() {

        // Destroy session.
        return axios.get(config.url + 'api/users/logout', {
                headers: {
                    'Access-Control-Allow-Origin': '*',
                    'Content-Type': 'application/json',
                },
            })

任何帮助都将不胜感激。

共有1个答案

孔瑾瑜
2023-03-14

我找到了解决我问题的办法。在这里发帖,以防其他人遇到类似的问题。

发送到服务器的GET请求不包括任何凭据,因为默认情况下,该请求设置为false。

解决方案是在请求中将“with-credentials”显式设置为true,如下所示:

        // Logout - end this user session.
@action logout() {

    // Destroy session.
    return axios.get(config.url + 'api/users/logout', {
            headers: {
                'Access-Control-Allow-Origin': '*',
                'Content-Type': 'application/json',
            },
            withCredentials: true
        })
 类似资料:
  • 在应用程序中创建了会话 在Redis CLI中运行“keys*”命令,看到一个新条目(如“spring:session:sessions:6b55103a-baf5-4a05-a127-3a9cfa15c164”) 从应用程序中向会话添加自定义bean 在Redis CLI中运行“keys*”命令,并看到该bean的另一个新条目(如“\xac\xed\x00\x05t\x00\tcustomer1

  • 问题内容: 我正在尝试在我的Express应用程序中使用redis进行会话。 我执行以下操作: 稍后,在我的应用程序中,如果执行以下操作: 我得到: 无法读取未定义的属性“ someProperty” 这表明req.session是未定义的 (我可以从config部分的console.log条目中看到) 我肯定有redis运行,并且可以看到我的应用最初连接到它(使用redis-cli监视器) 问题

  • 我的购物车有两个功能,第一个是退货总价和商品总数量: 这两个函数返回这两个参数: 和: 我可以通过此功能销毁所有购物车会话: 如何删除特定购物车项目?我在使用这个方法,它的工作。但它不会改变总价和总数量:

  • 问题内容: 如果一个用户已经登录并尝试在新实例中再次登录,我希望它注销另一个用户实例。我不希望同一用户在我的应用程序上登录两次。 当前会话存储在Redis存储中,我正在使用express / connect处理会话存储。可以用来破坏会话的可用功能之一如下: 但是,我需要在调用.destroy()之前找到该会话ID。在Redis中,用户名存储为会话的一部分。 问题:是否可以查询Redis以基于用户名

  • 问题内容: 我一直在寻找用于在MongoDB中存储会话数据以在使用Express的生产应用程序中使用的最佳中间件。 我一直在四处寻找,发现了这一点: session-mongoose (https://github.com/donpark/session-mongoose)根据作者的评论,由于以下原因,该产品尚未投入生产: connect-mongo (https://github.com/kcb

  • 问题内容: 我正在使用Django和Redis作为会话引擎(也是Celery,但这是其他东西)。它运行完美,我可以看到速度有所提高。 我有一个脚本,每分钟运行一次,以通过某些方法检查活动用户,如果该用户在最近一分钟内未处于活动状态,则该会话将被删除。这样做是为了满足客户的跟踪需求。 在我切换到Redis作为会话引擎之前,该脚本运行良好。实际上,该会话确实已从数据库中删除,但未从Redis中删除。我