对这个中间件express-session的一些设置一直是懵懵懂懂,现在稍微懂了一点。 先简单的看下代码吧:
这是路由页面代码 cookieRouter.js
var express = require('express'); var bodyParser = require('body-parser');//引入此中间件解析表单post来的数据 var session = require('express-session');//引入此中间件设置session var cookieParser = require('cookie-parser');//引入此中间件设置cookie var router = express.Router();//建一个路由 router.use(bodyParser.urlencoded({ extended: false }));//解析url数据 router.use(cookieParser('cookie'));//设置coookie签名用的字符串,这个字符串要和session里面相同。 router.use(session({ cookie: { domain: 'localhost', //设置域,注意不能加端口名,踩过此坑。 path: '/base',//设置cookie所在的url signed: true, //设置签名 maxAge: 100000,//设置过期时间,单位是毫秒 }, resave: false, //每次设置是否要保存 saveUninitialized:false, //是否存储没有初始化的session. 所谓初始化是指生成session.id以后有没有设置value修改过此session secret:'cookie',//签名字符串,需要和cookie的设置相同 rolling:false,//每次响应是否重新设置cookie的maxAge. unset:'destroy',//每次相应结束是否摧毁session })); router.get('/', function (req, res) { res.send('this is a router base page!'); }); //进入路由根目录界面/base router.get('/index1.html', function (req, res, next) { res.sendFile(__dirname + '/index1.html'); next(); });//在base/index1.html中渲染index1.html的html页面 router.get('/index1.html', function (req, res) { // req.session.regenerate(function(err){ console.log(req.session.id);//每次请求此页面打印出session.id // }); }); router.post('/index1.html', function (req, res) { if(!req.session.user) req.session.user = req.body; res.setHeader('Content-Type','text/html'); res.write('session:' + JSON.stringify(req.session)); res.write('expires:'+ JSON.stringify(req.session.cookie.maxAge/1000)); res.end(); }); //提交表单以后把表单信息设置成session, 并且在客户端打印出相关信息。这里用了res.write()所以要用res.end()结尾 module.exports = router;下面是app.js
var express = require('express'); var app = express(); var cookieRouter = require('./cookieRouter.js'); app.get('/', function (req, res, next) { res.send('this is home page!'); next(); //这是主页 }); app.use('/base', cookieRouter); //这是路由的路径/base app.listen(1338);//监听1338端头下面是个简单的客户端表单,用post方法提交数据
index1.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Express Post method</title> </head> <body> <form id="form1" , method="POST" action="index1.html"> <!-- <form id="form1" , method = "POST" action="index1.html?_method=PUT"> --> username: <input type="text" , name="username" , value="ss" /><br/> password: <input type="password" name="password" id="password"><br/> <input type="submit" value="submit" /> </form> </body> </html>运行app.js后在浏览器进入
localhost:1338/base/index1.html
在没有填写表单的情况之下不停刷新表单,会看到控制台不停变化的session.id
rYRMfIO7Lx691L4feFC9eL7T-bmPJfSn Wv-7ruXhUBRT-EephvqjZtfOtVEDymnT gtDWlSUHeZldmDIIq8UN_9A6xqjIFJxh eUgHXVP85WVqOzRdHXkVyJ8SBmileLRd sbHZyQZU70-hHSxmhdM-M9a-RHazQM_T
其实这个时候由于我们还没有给session赋值,所以这些session.id都是每次响应自动生成,但是没有初始化的session.
这个时候如果我们在表单里面填写用户名和密码然后点击submit, 提交数据。这时候我们可以看到在客户端输出如下信息
我们可以看出已经把表单信息保存到session里面。 这里默认的session.id的名字是connect.sid, 你也可以通过session.name自行修改
如果我们等个几秒钟再刷新页面,你会发现cookie.expires在减少。
expires:92.278但是如果你再次刷新页面,相当于重新设了session并且传给cookie. expires又回到了100。
如果你用 rolling: true,那么每次刷新页面都是expires:100或者99.xx 因为被强制设定了。
你现在每次刷新页面,发现session.id已经不再改变,说明用此session.id存入了值。
pq4ClXzBYDak9AkhOXBQQvxqRvrbrQSd pq4ClXzBYDak9AkhOXBQQvxqRvrbrQSd pq4ClXzBYDak9AkhOXBQQvxqRvrbrQSd
你在post响应后面加上一句
router.post('/index1.html', function (req, res) { if (!req.session.user) req.session.user = req.body; res.setHeader('Content-Type', 'text/html'); res.write('session:' + JSON.stringify(req.session)); res.write('expires:' + JSON.stringify console.log('post: ' + req.session.id);//加上一句 res.end(); });你会发现get和post的session.id是一样的,无论我提交多少次表单
post: 9YA0T4BGwaQIRL3fITiEGoOssMX4ICPH get: 9YA0T4BGwaQIRL3fITiEGoOssMX4ICPH get: 9YA0T4BGwaQIRL3fITiEGoOssMX4ICPH post: 9YA0T4BGwaQIRL3fITiEGoOssMX4ICPH
可是如果把代码改成这样,每次重新regenerate session.id:
req.session.regenerate(function (err) { console.log('post: ' + req.session.id); });那么get和post的session.id就不一样了。
get:8hwfEA4qCH_QscA8lXCRQ8eMCq5Ssa_O post:get:5Ix7rvu_ckiPD9Fd-DEgKYfaaOIt7ZwQ get:lhFWi2FMZDjPfVtamM1t_8wdn9UAe3Zc post: PZWEnTrMZBOe5T_qeQ9O1IidtMSh6K7C
