对这个中间件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