1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > node.js中cookie数据丢失导致session失效问题

node.js中cookie数据丢失导致session失效问题

时间:2019-01-13 09:32:00

相关推荐

node.js中cookie数据丢失导致session失效问题

问题

今天刚准备用node.js作为后端语言来开发就遇到了一个小坑,网上的资料还是比较的少,于是我决定记录下来。关于session和cookie我就不做具体的介绍了,网上有挺多资料的。我打算实现的功能:登录,在用户登录之后,把用户的uname存到session里面,在访问一些需要登录之后才能访问的页面的时候,去sesion中查看时候在该值是否存在,存在则已经登录,不存在则未登录(一个比较简单的功能)。但是我发现,在登录之后,我去设置req.session.user的值,再马上console.log(req.session.user)的值发现是可以取到的;跳转到别的页面之后,我再去请求req.session.user发现该值为空,不存在。

剧透一下:该问题是由于跨域时cookie保存的数据丢失了而导致的,详细可看下面

代码和效果如下

index.js

const http = require("http")const express = require('express');const bodyParser = require('body-parser');const cookieParser = require('cookie-parser');const session = require('express-session');const cors = require('cors');const pool = require('./pool');const routerUser = require('./router/user');let app = express();http.createServer(app).listen(8081);// 中间件app.use(bodyParser.urlencoded({extended: false }));app.use(cors({origin:["http://127.0.0.1","http://localhost","http://127.0.0.1:8080","http://localhost:8080"],credentials:true}));app.use(cookieParser());app.use(session({secret:'logaawing',cookie:{maxAge:60000},resave:false,//每次请求是否需要重新设置cookiesaveUninitialized:true//无论是否有cookie,设置标记connect.sid可改名}));// 路由器app.use('/user',routerUser);

user.js //user.js在和index.js同级的router目录下

const express = require('express')const pool = require('../pool.js');let router = express.Router();module.exports = router;router.post("/login",function(req,res){let uname = req.body.uname;let upwd = req.body.upwd;let sql = "SELECT user_name FROM home_admin WHERE aname = ? AND apwd = md5(?)";pool.query(sql,[uname,upwd],(err,result)=>{if(err) throw err;if(result.length>0){username = result[0].user_name;req.session.user = username;console.log(req.session);res.json({errno:0,uname:username});}else{res.json({errno:1,msg:'登录失败,账号或密码错误'})}})})router.get("/session",function(req,res){console.log(req.session);res.send(req.session.user);})

注:我这两次访问是在同一个会话里访问的

从图片中可以发现,我在同一个会话里再次去访问session,发现这个session已经不是同一个session了,我存进去的user也不见了。

思考

出现问题就要解决问题嘛。因为node.js学了也不太久,也没怎么用过session,我一开始一直以为是由于我的session哪个位置写错了所以导致了这个问题的产生, 后来想起之前有个朋友给我说过nodejs中的session有一个坑是跨域导致的。于是我就朝着这个方向去找解决的方法。

解决

session的工作流程:当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value) 。 客户的信息都保存在session中。

导致问题出现的原因:跨域时cookie保存的数据丢失了

因为vue中使用的是8080端口,我node.js启的服务器用的是8081端口,端口不一样也就存在着跨域的问题。

于是我在客户端中的请求信息中加上了withCredentials:true,也就是在发起请求的时候要求它一定要带上cookie信息

我是用vue进行开发的,下面是在vue中的方法(请求的时候加上credentials: true):

在一般的ajax请求中则要加上

$.ajax({xhrFields:{withCredentials:true}});

在进行了以上的修改之后再次运行程序可以发现,在同一个会话中再次访问session的时候,user的值没有丢失

以上就是我使用node.js exprees框架中的session所遇到的问题以及解决方法,有哪里写的不对的欢迎大家指出,谢谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。