今天刚准备用node.js做为后端语言来开发就遇到了一个小坑,网上的资料仍是比较的少,因而我决定记录下来。关于session和cookie我就不作具体的介绍了,网上有挺多资料的。我打算实现的功能:登陆,在用户登陆以后,把用户的uname存到session里面,在访问一些须要登陆以后才能访问的页面的时候,去sesion中查看时候在该值是否存在,存在则已经登陆,不存在则未登陆(一个比较简单的功能)。可是我发现,在登陆以后,我去设置req.session.user的值,再立刻console.log(req.session.user)的值发现是能够取到的;跳转到别的页面以后,我再去请求req.session.user发现该值为空,不存在。
剧透一下:该问题是因为跨域时cookie保存的数据丢失了而致使的,详细可看下面
代码和效果以下
index.jsvue
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, //每次请求是否须要从新设置cookie saveUninitialized:true //不管是否有cookie,设置标记connect.sid可更名 })); // 路由器 app.use('/user',routerUser);
user.js //user.js在和index.js同级的router目录下node
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也不见了。ajax
出现问题就要解决问题嘛。由于node.js学了也不过久,也没怎么用过session,我一开始一直觉得是因为个人session哪一个位置写错了因此致使了这个问题的产生, 后来想起以前有个朋友给我说过nodejs中的session有一个坑是跨域致使的。因而我就朝着这个方向去找解决的方法。sql
session的工做流程:当浏览器访问服务器并发送第一次请求时,服务器端会建立一个session对象,生成一个相似于key,value的键值对, 而后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value) 。 客户的信息都保存在session中。
致使问题出现的缘由:跨域时cookie保存的数据丢失了
由于vue中使用的是8080端口,我node.js启的服务器用的是8081端口,端口不同也就存在着跨域的问题。
因而我在客户端中的请求信息中加上了withCredentials:true,也就是在发起请求的时候要求它必定要带上cookie信息
我是用vue进行开发的,下面是在vue中的方法(请求的时候加上credentials: true):express
在通常的ajax请求中则要加上json
$.ajax({ xhrFields:{withCredentials:true} });
在进行了以上的修改以后再次运行程序能够发现,在同一个会话中再次访问session的时候,user的值没有丢失后端
以上就是我使用node.js exprees框架中的session所遇到的问题以及解决方法,有哪里写的不对的欢迎你们指出,谢谢!跨域