nodejs入门(四)

express中间件cookie的基本使用

Cookie特点

  • cookie保存在浏览器本地
  • 正常设置的cookie是不加密的,用户可以自由看到;
  • 用户可以删除cookie,或者禁用它
  • cookie可以被篡改
  • cookie可以用于攻击
  • cookie存储量很小。未来实际上要被localStorage替代,但是后者IE9兼容。

Cookie的安装

npm init --yes
npm install express --save
npm install cookie-parser --save

引入并设置中间件

// 引入
var cookieParser = require('cookie-parser');
// 设置中间件
app.use(cookieParser());
// 设置cookie
res.cookie("name",'zhangsan',{maxAge: 900000, httpOnly: true});
// 获取cookie
req.cookies.name

cookie操作的例子

var express=require('express'); /*引入*/
var cookieParser = require('cookie-parser');
var app = new express();  /*实例化*/

app.set('view engine','ejs');
// 设置中间件
app.use(cookieParser());
app.get('/',function(req,res){
    console.log(req.cookies.name)
    res.send("首页")
})

app.get('/set',function(req,res){
    // 参数1:名字
    // 参数2:cookie的值
    // 参数3:cookie的配置信息
    res.cookie("name", 'zhangsan', {maxAge: 900000, httpOnly: true});
    res.send("cookie设置成功.")
})

app.get('/del',function(req,res){
    res.cookie('name', '', { expires: new Date(0)});
    // domain配置二级域名才用得到,domain:'.ccc.com':多个二级域名共享
    // res.cookie('name','',{domain:'.ccc.com',maxAge:0,httpOnly:true});
    res.send("cookie删除成功.")
})

app.listen(8081,'127.0.0.1');

res.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是保存在本地并且是明文的,如果让用户看不到,可以有一下几种方法

  • 1、保存时候加密
  • 2、使用cookie-parser里面的signed参数

配置中间件的时候需要传参

var cookieParser = require('cookie-parser'); app.use(cookieParser('123456'));

设置cookie的时候配置signed属性

res.cookie('userinfo','hahaha',{domain:'.ccc.com',maxAge:900000,httpOnly:true,signed:true});

signedCookies调用设置的cookie

console.log(req.signedCookies);

测试例子如下

var express=require('express'); /*引入*/
var app = new express();  /*实例化*/

// 设置cookie加密密码为123456
var cookieParser = require('cookie-parser');
app.use(cookieParser('123456'));

app.set('view engine','ejs');
// 设置中间件
app.use(cookieParser());
app.get('/',function(req,res){
    // console.log(req.cookies.name)
    console.log(req.signedCookies) // 加过密的cookie
    res.send("首页")
})

app.get('/set',function(req,res){
    // 参数1:名字
    // 参数2:cookie的值
    // 参数3:cookie的配置信息
    res.cookie("name", 'zhangsan', {maxAge: 900000, httpOnly: true, signed:true});
    res.send("cookie设置成功.")
})

app.get('/del',function(req,res){
    res.cookie('name', '', { expires: new Date(0)});
    // domain配置二级域名才用得到,domain:'.ccc.com':多个二级域名共享
    // res.cookie('name','',{domain:'.ccc.com',maxAge:0,httpOnly:true});
    res.send("cookie删除成功.")
})

app.listen(8081,'127.0.0.1');

明文保存的cookie

设置signed:true后的cookie

一个综合使用cookie的例子

当cookie保存我们浏览过的信息,在cookie中使用数组保存列表信息

var express=require('express'); /*引入*/
var app = new express();  /*实例化*/

// 设置cookie加密密码为123456
var cookieParser = require('cookie-parser');
app.use(cookieParser());

app.set('view engine','ejs');
// 设置中间件
app.use(cookieParser());
app.get('/',function(req,res){
    console.log(req.cookies.citys)
    res.send("去过的城市:" + req.cookies.citys)
})

app.get('/lvyou',function(req,res){
    let city = req.query.city;
    // 判断cookie是否有值
    var citys = req.cookies.citys;
    console.log(citys)
    if(citys) {
        citys.push(city)
    } else {
        var citys = []
        citys.push(city)
    }

    // 得到get参数信息
    res.cookie("citys", citys, {maxAge: 9000000, httpOnly: true});
    res.send("cookie设置成功.")
})

app.listen(8081,'127.0.0.1');

express中间件session的基本使用

Session的用途:

  • session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存。
  • 当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。
  • session可以和Redis 或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)丢失。

Session的工作流程:
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对,然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。客户的信息都保存在session 中

express中间件 express-session常见参数配置使用

express-session 的使用

npm install express-session --save

引入express-session

var session = require("express-session");

设置官方文档提供的中间件

app.use(session({
    secret: 'keyboard cat',
    resave: true,
    saveUninitialized: true
}))

使用

设置值req.session.username = "张三";
获取值req.session.username

一个session使用的例子

var express = require("express");
var app = express();

var session = require("express-session");
//配置中间件
app.use(session({
	secret: 'keyboard cat',
	resave: false,
	saveUninitialized: true
	//cookie: { secure: true }   /*secure https这样的情况才可以访问cookie*/
}))

app.get("/",function(req,res){
	//获取sesssion
	if(req.session.userinfo){  /*获取*/
		res.send('你好'+req.session.userinfo+'欢迎回来');
	}else{
		res.send('未登录');
	}
});

app.get("/login",function(req,res){
	req.session.userinfo="zengraoli"; /*设置session*/
	res.send('登录成功');
});

app.get("/logout",function(req,res){
	// req.session.cookie.maxAge=0;  /*改变cookie的过期时间*/
  	// 销毁
	req.session.destroy(function(err){
		console.log(err);
	})
	res.send('退出登录成功');
});

app.listen(8081)

express-session 的常用参数:

参数作用
secret一个String 类型的字符串,作为服务器端生成session的签名
name返回客户端的key 的名称,默认为connect.sid,也可以自己设置
resave强制保存session即使它并没有变化,。默认为true。建议设置成false。don’t save session if unmodified
saveUninitialized强制将未初始化的session 存储
cookie设置返回到前端key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }
rolling在每次请求时强行设置cookie,这将重置cookie 过期时间(默认:false)

express-session 的常用方法:

req.session.destroy(function(err) { /*销毁session*/
})
req.session.username='张三'; //设置session
req.session.username //获取session
req.session.cookie.maxAge=0; //重新设置cookie 的过期时间

具体的配置参考:

// 配置中间件
app.use(session({
	secret: 'this is string key', // 可以随便写。 一个 String 类型的字符串,作为服务器端生成 session 的签名
	name:'session_id',/*保存在本地cookie的一个名字 默认connect.sid  可以不设置*/
    resave: false,   /*强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。*/
	saveUninitialized: true,   //强制将未初始化的 session 存储。  默认值是true  建议设置成true
	cookie: {
		maxAge:5000    /*过期时间*/
	},   /*secure https这样的情况才可以访问cookie*/
	//设置过期时间比如是30分钟,只要游览页面,30分钟没有操作的话在过期
	rolling:true //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)
}))

express-session 多服务器负载均衡 session保存到数据库

有时候可能会涉及到nginx这样的负载均衡,每个地区的服务器都不知道当前的session,所有保存到mongodb上会避免一些麻烦

需要安装express-session和connect-mongo模块

npm install express-session --save
npm install connect-mongo --save

引入模块

var session = require("express-session");
var MongoStore = require("connect-mongo")(session);

设置官方文档提供的中间件

app.use(session({
 	secret: 'keyboard cat',
	 resave: false,
	 saveUninitialized: true,
	 store:new MongoStore({
		 url: 'mongodb://127.0.0.1:27017/student', // 数据库的地址
	 	 touchAfter: 24 * 3600  // time period in seconds 保持24小时不变
	 })
}))

使用

// 设置值
req.session.username = "张三";
// 获取值
req.session.username

一个完整的使用例子

var express = require("express");
var app = express();
var session = require("express-session");
var MongoStore = require("connect-mongo")(session);

// 配置中间件
app.use(session({
	secret: 'this is string key', // 可以随便写。 一个 String 类型的字符串,作为服务器端生成 session 的签名
	name:'session_id',/*保存在本地cookie的一个名字 默认connect.sid 可以不设置*/
    resave: false,   /*强制保存 session 即使它并没有变化,。默认为 true。建议设置成false。*/
	saveUninitialized: true,   //强制将未初始化的 session 存储。默认值是true 建议设置成true
	cookie: {
		maxAge:5000    /*过期时间*/
	},   /*secure https这样的情况才可以访问cookie*/
	//设置过期时间比如是30分钟,只要游览页面,30分钟没有操作的话在过期
	rolling:true, //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)
	store:new MongoStore({
		url: 'mongodb://127.0.0.1:27017/test',  //数据库的地址
		touchAfter: 24 * 3600   //time period in seconds  通过这样做,设置touchAfter:24 * 3600,您在24小时内只更新一次会话,不管有多少请求(除了在会话数据上更改某些内容的除外)
	})
}))

app.get("/",function(req,res){
	//获取sesssion
	if(req.session.userinfo){  /*获取*/
		res.send('你好'+req.session.userinfo+'欢迎回来');
	}else{
		res.send('未登录');
	}
});

app.get("/login",function(req,res){
	req.session.userinfo="zengraoli"; /*设置session*/
	res.send('登录成功');
});

app.get("/logout",function(req,res){
	// req.session.cookie.maxAge=0;  /*改变cookie的过期时间*/
  	// 销毁
	req.session.destroy(function(err){
		console.log(err);
	})
	res.send('退出登录成功');
});

app.listen(8081)

在没有使用之前mongodb

use test
db.sessions.drop()
show collections

浏览器访问http://127.0.0.1:8081/login后,在查看

use test
show collections
db.sessions.find()

输出如下内容,即为session保存的

{ "_id" : "WB5LY0CyLKbGi4DsPiSzxOWHJq6tykI-", "expires" : ISODate("2020-08-22T13:52:26.165Z"), "lastModified" : ISODate("2020-08-22T13:52:21.166Z"), "session" : "{\"cookie\":{\"originalMaxAge\":5000,\"expires\":\"2020-08-22T13:52:26.165Z\",\"httpOnly\":true,\"path\":\"/\"},\"userinfo\":\"zengraoli\"}" }

Cookie 和Session 区别

有以下几点

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE
  • 单个cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

全文所涉及的代码下载地址

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值