• express中的cookie和Session


    cookie

    cookie 是存储于访问者的计算机中的变量,可以让我们用同一个浏览器访问同一个域名的时候共享数据。
    由于HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。Cookie 是一个简单到爆的想法:当访问一个页面的时候,服务器在下行 HTTP 报文中,命令浏览器存储一个字符串; 浏览器再访问同一个域的时候,将把这个字符串携带到上行HTTP 请求中。第一次访问一个服务器,不可能携带 cookie。 必须是服务器得到这次请求,在下行响应报头中,携带 cookie 信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个 cookie。

    基础使用

    Express 中要使用 Cookie 的话,我们需要使用 cookie-parser 模块来实现:
    1、安装中间件:cnpm install cookie-parser --save
    2、使用中间件:

     然后,我们就可以在浏览器中查看cookie

     常用属性

    • domain:域名 name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name不能和其他属性项的名字一样
    • Expires:过 期 时 间 ( 秒 ) , 在 设 置 的 某 个 时 间 点 后 该 Cookie 就 会 失 效 , 如expires=Wednesday, 09-Nov-99 23:12:40 GMT
    • maxAge:最大失效时间(毫秒),设置在多少后失效
    • secure:当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
    • Path:表示 cookie 影响到的路路径,如 path=/。如果路径不能匹配时,浏览器则不发送这个 Cookie
    • httpOnly:是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通过程序(JS 脚本、applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生
    • singed:表示是否签名 cookie, 设为 true 会对这个 cookie 签名,这样就需要用res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且 cookie 值会重置为它的原始值

     

     删除cookie

     加密cookie

       

    Session

    Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上。Session 相比 Cookie 要更安全一些。由于 Session 保存到服务器上,所以当访问量增多的时候,会比较占用服务器的性能。单个 cookie 保存的数据大小不能超过 4K,很多浏览器都限制一个站点最多保存 20个 cookie。Session 没有这方面的限制。Session 是基于 Cookie 进行工作的。

    基础使用

    1、安装中间件:cnpm install express-session --save

    2、使用中间件:

    const express = require('express')
    const session = require('express-session')
    const app=express()
    //配置session的中间件
    app.use(session({
        secret: 'this is session', //服务器端生成 session 的签名
        name:"node", //修改session对应cookie的名称
        resave: false, //强制保存 session 即使它并没有变化
        saveUninitialized: true, //强制将未初始化的 session 存储
        cookie: { 
            maxAge:1000*60*30,
            secure: false  // true 表示只有https协议才能访问cookie  
        },
        rolling:true  //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)
    }))
    app.get("/login",(req,res)=>{  
        //设置seesion
        req.session.username="张三"
        req.session.age=20
        res.send("执行登录")
    })
    
    app.get("/news",(req,res)=>{
        //获取seesion
        if(req.session.username || req.session.age){
            res.send(req.session.username+"--"+req.session.age+"-已登录")        
        }else{
            res.send("没有登录")
        }
    })
    app.listen(3000)

      

     session删除

     删除session有三种方式:

    1、设置过期时间(对所有有效)

    req.session.cookie.maxAge=0;

     2、赋空值(仅对当前指定字段有效)

    req.session.username="";
    3、使用销毁方法
    req.session.destroy();

    负载均衡配置 Session,把 Session 保存到数据库里面

     如果要将session存放到数据库中,实现负载均衡,需要借助connect-mongo中间件:

    1、执行npm命令安装cnpm install connect-mongo --save

    2、引入模块,并在session的基础上配置中间件

     

     其中url是数据库的连接地址加上需要存放的数据库名称,这个数据库可以是存在的,也可以是不存在的,如果不存在,就会自动新建。

    3、存储session

     4、查看session

     
  • 相关阅读:
    Database "C:/Users/com/test" not found, either precreate it or allow remote database creation (not recommended in secure environments) [90149200] 90149/90149 (帮助) 解决
    python学习——windows下pandarallel cannot find context for ‘fork‘
    mysql as if 多个,mysql as多个if语句
    新安装 eclips 下载进度条不动,解决办法
    Java EE: XML Schemas for Java EE Deployment Descriptors
    java 删除所有早于N天的文件(递归选项,它遍历子文件夹)
    pandas groupby 取每组的前几行记录方法
    python dataframe rename_详解pandas DataFrame修改行列名
    Spring MVC 整合Velocity及用法说明
    java判断日期大小,大于等于,小于等于
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/13952251.html
Copyright © 2020-2023  润新知