- 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 条
- 全部回答
-
攒一ロ袋°βθ光~の 普通会员 1楼
在Node.js中,当你在页面跳转后, session 中的数据会丢失,这是因为 session 是存储在服务器端的,数据在服务器端被保存和刷新,而在客户端,当用户点击跳转按钮时,浏览器会发送一个 HTTP 请求到服务器,服务器接收请求后,会将 session 数据存储在客户端,用户再次访问服务器时,会再次发送请求到服务器,服务器将 session 数据从客户端发送回服务器。
如果你的页面跳转后, session 中的数据消失,可能是由于以下原因:
-
浏览器缓存:浏览器的缓存机制可能会将服务器的 session 数据缓存,用户再次访问同一页面时,浏览器会从缓存中读取 session 数据,而不是从服务器上获取。如果你的 session 数据的过期时间设置过长,或者浏览器的缓存时间设置过短,可能会导致 session 数据在浏览器缓存中过期,从而导致数据消失。
-
访问频率:如果你频繁地刷新页面,或者 session 数据的生命周期设置过短,浏览器可能会将 session 数据频繁地从服务器上刷新,从而导致 session 数据在浏览器缓存中过期,从而导致数据消失。
-
服务器端代码问题:如果服务器端的 session 数据存储逻辑有误,例如在 session 数据的设置、获取或删除操作中,出现了问题,可能会导致 session 数据在服务器端的响应时间过长,从而导致 session 数据在浏览器缓存中过期,从而导致数据消失。
以下是一些解决这个问题的方法:
-
浏览器缓存设置:你可以在服务器端设置 session 数据的过期时间,例如将 session 数据的过期时间设置为
session_timeout,或者在浏览器中设置sessionStorage的setExpireTime方法,使其设置为服务器端设置的时间。这样,当 session 数据过期时,浏览器会从服务器上清除 session 数据,从而避免 session 数据在浏览器缓存中过期导致数据消失。 -
浏览器缓存刷新频率:你可以设置页面刷新的频率,例如在页面刷新时,检查 session 数据是否过期,如果过期,则清除 session 数据,以防止 session 数据在浏览器缓存中过期导致数据消失。
-
服务器端代码逻辑优化:你可以优化服务器端的 session 数据存储逻辑,例如使用数据库或其他持久化存储方式,如 Redis 或 MongoDB,来存储 session 数据,这样,即使 session 数据的生命周期设置过短,也可以在服务器端持久化存储,从而避免 session 数据在浏览器缓存中过期导致数据消失。
-
浏览器兼容性:确保你的服务器和浏览器都能正确地处理 session 数据。例如,有些浏览器(如 Chrome、Firefox)不支持 session 数据的本地存储,需要在服务器端使用服务器端存储方式,如 MongoDB 或 Redis,来存储 session 数据。而有些浏览器(如 Safari、Edge)支持 session 数据的本地存储,只需要在服务器端使用服务器端存储方式即可。在开发过程中,需要根据具体的浏览器环境,选择合适的存储方式。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
