题目
本日刚准备用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, //每次请求是不是须要从新设置cookie
saveUninitialized: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所碰到的题目以及处理要领,有那里写的不对的迎接人人指出,感谢!