账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    用nodejs做后端,页面跳转后session中的数据消失,请问怎么解决?
    20
    0

    我的前端页面放在ngnix里面,端口是80

    我的后台是用nodejs写的,端口是3060,

    现在我在登陆页面进行登陆,请求http://www.xinlizhiyouni.com:80/user/login/phone接口,然后将数据保存到nodejs的session中,然后跳转到http://www.xinlizhiyouni.com:80/advertise/add.html请求http://www.xinlizhiyouni.com:80/user/logout接口,但是此时session数据为undefine,请问为什么我的session数据丢失了,怎么才能正确在session中保留数据,然后跳转后不丢失

    
    //设置跨域访问
    app.all('*', function(req, res, next) {
       res.header("Access-Control-Allow-Origin", "*");
       res.header("Access-Control-Allow-Headers", "X-Requested-With");
       res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
       res.header("X-Powered-By",' 3.2.1');
       res.header("Content-Type", "application/json;charset=utf-8");
       next();
    });
    
    app.all('/user/login/phone', (req, res) => {
        let sess = req.session;
        let param = req.body;
        console.log('param == ', param)
        let selectParams = {
            phone: param.mobilePhoneUsername
        };
        let userModSql = "SELECT ul.password, ui.uid, ui.name, ui.sex, ui.phone FROM user_information ui, user_login ul WHERE ui.uid=ul.id AND ui.phone=?";
        pool.getConnection( (err, connection) => {
            if (err) {
                throw err;
            } else {
                connection.query(
                    userModSql,
                    [selectParams['phone']],
                    function (err, rows) {
                        if (err) {
                            throw err;
                        } else {
                            console.log("rows === ", rows);
                            let verifySign = cryptPwd(param.mobilePhonePassword, "liu")
                            console.log("verifySign === ", verifySign);
                            if (rows[0].password === verifySign ) {
                                req.session.loginUserInfo = rows[0]
                                //设置cookie
                                res.cookie('username',rows[0], {maxAge:100000}); //有效期以毫秒为单位
                                // res.json({code: 0, message: 'success'});
                                res.redirect('http://www.xinlizhiyouni.com:80/advertise/add.html');
                            } else {
                                res.json({code: 1, message: 'fail'});
                            }
                        }
                    }
                )
            }
        })
    });
    
    app.all("/user/logout", function(req, res, next) {
        console.log("loginUserInfo == ", req.session.loginUserInfo);
        res.json({ret_code: 0, ret_msg: '退出登录成功'});
    });
    

    配置session的代码

    app.use(bodyParser.urlencoded({ extended: false }))
    // parse application/json
    app.use(bodyParser.json());
    
    app.use(cookieParser());
    app.use(session({
        secret: '123456',
        cookie: {maxAge: 60000},
        resave: false
    }));

    修改后的代码

    let identityKey = 'superKey';
    
    app.use(cookieParser());
    app.use(session({
        name: identityKey,
        secret: 'heart',  // 用来对session id相关的cookie进行签名
        cookie: {maxAge: 60000},
        resave: false
    }));
    
    //设置跨域访问
    app.all('*', function(req, res, next) {
       res.header("Access-Control-Allow-Origin", "*");
       res.header("Access-Control-Allow-Headers", "X-Requested-With");
       res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
       res.header("X-Powered-By",' 3.2.1');
       res.header("Content-Type", "application/json;charset=utf-8");
       next();
    });
    
    app.all('/', function(req, res, next){
        let sess = req.session;
        let loginUser = sess.loginUser;
        let isLogined = !!loginUser;
    });
    
    // 登录接口
    app.all('/test/user/login', function(req, res, next){
        let sess = req.session;
        let user = {
            "name": req.body.name
        };
        console.log("登陆接口测试");
        sess.loginUser = user.name;
        res.json({ret_code: 0, ret_msg: '登录成功'});
    });
    
    app.all('/test/user/logout', function(req, res, next){
        let sess = req.session;
        let loginUser = sess.loginUser;
    
        console.log("测试登出接口");
        console.log(loginUser);
    
    });
    
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 在Node.js中,当你在页面跳转后, session 中的数据会丢失,这是因为 session 是存储在服务器端的,数据在服务器端被保存和刷新,而在客户端,当用户点击跳转按钮时,浏览器会发送一个 HTTP 请求到服务器,服务器接收请求后,会将 session 数据存储在客户端,用户再次访问服务器时,会再次发送请求到服务器,服务器将 session 数据从客户端发送回服务器。

      如果你的页面跳转后, session 中的数据消失,可能是由于以下原因:

      1. 浏览器缓存:浏览器的缓存机制可能会将服务器的 session 数据缓存,用户再次访问同一页面时,浏览器会从缓存中读取 session 数据,而不是从服务器上获取。如果你的 session 数据的过期时间设置过长,或者浏览器的缓存时间设置过短,可能会导致 session 数据在浏览器缓存中过期,从而导致数据消失。

      2. 访问频率:如果你频繁地刷新页面,或者 session 数据的生命周期设置过短,浏览器可能会将 session 数据频繁地从服务器上刷新,从而导致 session 数据在浏览器缓存中过期,从而导致数据消失。

      3. 服务器端代码问题:如果服务器端的 session 数据存储逻辑有误,例如在 session 数据的设置、获取或删除操作中,出现了问题,可能会导致 session 数据在服务器端的响应时间过长,从而导致 session 数据在浏览器缓存中过期,从而导致数据消失。

      以下是一些解决这个问题的方法:

      1. 浏览器缓存设置:你可以在服务器端设置 session 数据的过期时间,例如将 session 数据的过期时间设置为 session_timeout,或者在浏览器中设置 sessionStoragesetExpireTime 方法,使其设置为服务器端设置的时间。这样,当 session 数据过期时,浏览器会从服务器上清除 session 数据,从而避免 session 数据在浏览器缓存中过期导致数据消失。

      2. 浏览器缓存刷新频率:你可以设置页面刷新的频率,例如在页面刷新时,检查 session 数据是否过期,如果过期,则清除 session 数据,以防止 session 数据在浏览器缓存中过期导致数据消失。

      3. 服务器端代码逻辑优化:你可以优化服务器端的 session 数据存储逻辑,例如使用数据库或其他持久化存储方式,如 Redis 或 MongoDB,来存储 session 数据,这样,即使 session 数据的生命周期设置过短,也可以在服务器端持久化存储,从而避免 session 数据在浏览器缓存中过期导致数据消失。

      4. 浏览器兼容性:确保你的服务器和浏览器都能正确地处理 session 数据。例如,有些浏览器(如 Chrome、Firefox)不支持 session 数据的本地存储,需要在服务器端使用服务器端存储方式,如 MongoDB 或 Redis,来存储 session 数据。而有些浏览器(如 Safari、Edge)支持 session 数据的本地存储,只需要在服务器端使用服务器端存储方式即可。在开发过程中,需要根据具体的浏览器环境,选择合适的存储方式。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部