zoukankan      html  css  js  c++  java
  • express 中session的使用

    与cookie不同,session是保存在服务器上的数据。

    session的工作流程:

    当浏览器访问服务器并发起第一个请求时,服务器会创建一个session对象,生产一个类似于
    key-value的键值对,然后将key(实际上是cookie)返回给客户端浏览器,浏览器下次访问
    时,将携带保存在浏览器上的key,一起发送请求服务器找到相应的session(value)

    使用步骤:

    1. 安装 express-session
    
    	npm install express-session --save
    
    2. 引入 express-session
    
    	const session = require('express-session');
    
    3. 设置官方文档提供的中间件
    
    app.use(
    
      session({
        secret: "keyboard cat", //服务器端生成session的签名
        // name:"something name",//修改session对应cookie的名称
        resave: true, //强制保存session 即使他并没有发生变化
        saveUninitialized: true, //强制将未初始化的session存储
        cookie: {
          //session是基于cookies的
          maxAge: 1000 * 8,
          secure: false, //true表示只有https协议才能访问cookie
          rolling:true,//每次请求强行设置cookie,这件重置cookie的过期时间(默认时间)
        },
      })
    );  
    4. 使用
    
    	设置值:req.session.username = 'zlfan'
    	获取值:req.session.username 
    

    一个简单例子:

    const express = require('express')
    const session = require('express-session')
    const app = express()
    const port = 3000
    
    app.use(session({
    	secret: 'test',     		//服务器生成 session 签名,可以随意写
    	resave: false,              //强制保存 session 即使它没有变化,不配置会有提示
        saveUninitialized: true,    //强制将未初始化的 session 存储
        cookie: {
            maxAge: 1000*60*60,
            secure: false,			//设置为true,表示只有https协议才能访问
        },
        rolling: true,				//常用属性,刷新过期时间,或者说重新设置过期时间
    }))
    
    app.get('/', (req, res) => {
        req.session.name = 'zlfan';
        res.send('设置session成功')
    })
    
    app.get('/getSession', (req, res) => {
        if(req.session.name){
            res.send('getSession:'+req.session.name)
        }else{
            res.send('getSession:null')
        }
    })
    
    app.listen(port)
    

    销毁session

    // 1.设置 maxAge = 0,会将所有 session 销毁
    req.session.cookie.maxAge = 0;
    
    // 2.销毁指定 session ,如销毁上述例子的 session
    req.session.name = '';
    
    // 3.调用 destroy(),可以接收一个回调函数
    req.session.destroy();
    req.session.destroy( err => {} );
    

    在分布式环境使用session

    可以将session存储到数据库中,实现session的共享

    1. 安装 connect-mongo,你可以选择其他的数据库,redis、mysql
    
    	npm install connect-mongo --save
    	
    2. 引入 connect-mongo
    	
    	const session = require('express-session')
    	const MongoStore = require('connect-mongo')(session)
    	
    3. 在 session 中间件配置中添加 store 属性
    
    	store: new MongoStore({
            url: 'mongodb://127.0.0.1:27017/store',
            //不管发出多少请求,在24小时内只更新一次session,除非改变了session
            touchAfter: 24 * 3600,   
        })
    

    完整代码

    const express = require('express')
    const session = require('express-session')
    const MongoStore = require('connect-mongo')(session)
    const app = express()
    const port = 3000
    
    app.use(session({
    	secret: 'test',     		//服务器生成 session 签名,可以随意写
    	resave: false,              //强制保存 session 即使它没有变化,不配置会有提示
        saveUninitialized: true,    //强制将未初始化的 session 存储
        cookie: {
            maxAge: 1000*60*60,
            secure: false,			//设置为true,表示只有https协议才能访问
        },
        rolling: true,				//刷新过期时间,或者说重新设置过期时间
        store: new MongoStore({
            url: 'mongodb://127.0.0.1:27017/store',
            //不管发出多少请求,在24小时内只更新一次session,除非改变了session
            touchAfter: 24 * 3600,
        })
    }))
    
    app.get('/', (req, res) => {
        req.session.name = 'zlfan';
        res.send('设置session成功')
    })
    
    app.get('/getSession', (req, res) => {
        if(req.session.name){
            res.send('getSession:'+req.session.name)
        }else{
            res.send('getSession:null')
        }
    })
    
    app.listen(port)
    
  • 相关阅读:
    [P1034][NOIP2001]一元三次方程求解 (二分)
    考前停课集训 Day7 嘞
    [P4995]跳跳!(贪心)
    [P4994]终于结束的起点 (递推)
    考前停课集训 Day6 垒
    [BZOJ1899][ZJOI2004]Lunch 午餐 (DP)
    考前停课集训 Day5 累
    任务查询系统 【主席树】
    主席树入门
    HNOI2002 营业额统计 平衡树模板题 【splay】
  • 原文地址:https://www.cnblogs.com/bitlei/p/14390908.html
Copyright © 2011-2022 走看看