用户登录
用户注册

分享至

Node中的Cookie和Session

  • 作者: duang-duang_duang
  • 来源: 51数据库
  • 2021-09-24

1、cookie

http是无状态协议。例:打开一个域名的首页,进而打开该域名的其他页面,服务器无法识别访问者。即同一浏览器访问同一网站,每次访问都没有任何关系。

cookie的原理是:客户端浏览器在第一次访问服务器后,服务器返回一段json数据进行标识,此后当客户端浏览器再次访问同一个域时,每次都携带此cookie信息。

特点

  • cookie是不加密的,用户可以自由看到;
  • 用户可以删除cookie,或者禁用它,未设置失效时间,则默认关闭浏览器后失效
  • cookie可以被篡改
  • cookie可以用于攻击
  • cookie存储量很小。(小于4k)

cookie具有不可跨域名性。根据cookie规范,浏览器访问google只会携带google的cookie,而不会携带baidu的cookie。google也只能操作google的cookie,而不能操作baidu的cookie。

cookie在node.js中使用:

 1 const cookieparser = require('cookie-parser');     //模块  cookie-parser
 2 const app = express();
 3 app.use(cookieparser());               //中间件
 4 app.get('/',(req,res)=>{
 5     res.send('根路由');
 6 })
 7 app.get('/login',(req,res)=>{
 8     //获取客户端cookies
 9     console.log(req.cookies);
10 
11     //服务器下发cookie
12     res.cookie('heaven','666',{
13         maxage:900000                //有效时间,毫秒
14     });
15     res.send('ok');
16 })
17 
18 app.listen(3000);

2、session

服务器需要记录用户的状态,依赖cookie跟踪session,第一次创建session时,服务端会在http协议中告诉客户端,需要在cookie里面记录一个session id,以后客户端每次请求携带此session id,服务器就能识别客户端。

特点

  • session不是一个天生就有的技术,而是依赖cookie。当一个浏览器禁用cookie的时候,登录效果消失;或者用户清除了这个cookie,登录也消失;
  • session比cookie不一样在哪里呢?session下发的是乱码,并且服务器自己缓存一些东西;下次浏览器带着乱码上来,此时与缓存进行比较,看看是谁?
session在node.js中使用
/*
     session  数据存放在服务端,但索引存放在浏览器,浏览器是根据cookieid识别对应的session
     npm i express-session -s  使用session模块
 */
const express = require('express');
const session = require('express-session');     // 解析session的模块    express-session
const app = express();

//启动session的中间件,公式
app.use(session({           //要求客户端设置一个加密的cookie
    secret:'heaven',        //任意字符都行,给cookie加密
    cookie:{maxage:300000},
    resave:true,
    saveuninitialized:true,
}))
//中间件是按先后顺序执行的,所以放在前面拦截
app.get('/favicon.ico',(req,res)=>{
    return;
})

app.get('/',(req,res)=>{
    res.send('你的足迹是'+req.session.lvyou);
})
app.get('/:city',(req,res)=>{
    let city = req.params.city;
    // console.log(req.session);
    let cityarr = req.session.lvyou || [];
    cityarr.push(city);
    req.session.lvyou = cityarr;
    res.send("你今天去了"+city);
})

app.listen(3000);
/*
       将session从内存中提取到mongo数据库内
       npm i connect-mongo -s     将session存入mongo数据库的模块
*/
const express = require("express"),
    app = express(),
    session = require("express-session"),
    mongosession = require("connect-mongo")(session),
    mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://localhost/bounty",{usenewurlparser: true})
//session公式
app.use(session({
    secret:"doukeyi",           //秘钥,加密
    rolling:true,               //每次交互(操作页面,a标签,ajax)重新设定时间
    cookie:{maxage:1000*60*60}, //cookie有效期 1小时
    resave:false,               //是否每次请求都重新保存数据
    saveuninitialized:false,    //是否默认设置初始值
    store:new mongosession({
        url:"mongodb://localhost/bounty"        //session存入数据库,到期后自动清除数据库
    })
}))
/*
    清除session
*/
router.get("/logout",function (req,res) {
    req.session.destroy();
    res.redirect("/login");
})

3、区别

  • cookie是明码;session是乱码;
  • cookie存在客户端浏览器; session存在服务器;
  • cookie内存小;session内存大;
软件
前端设计
程序设计
Java相关