Express 4.x中间件express-session的详细解析

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值