一、Cookie 简介
● cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域
名的时候共享数据。
● HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页
面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何
关系的。
● Cookie 是一个简单到爆的想法:当访问一个页面的时候,服务器在下行 HTTP 报文中,
命令浏览器存储一个字符串; 浏览器再访问同一个域的时候,将把这个字符串携带到上行
HTTP 请求中。第一次访问一个服务器,不可能携带 cookie。 必须是服务器得到这次请求,
在下行响应报头中,携带 cookie 信息,此后每一次浏览器往这个服务器发出的请求,都会
携带这个 cookie。
二、Cookie 特点
● cookie 保存在浏览器本地,如果没有过期时间关闭浏览器再打开还是存在的。
● 正常设置的 cookie 是不加密的,用户可以自由看到;
● 用户可以删除 cookie,或者禁用它
● cookie 可以被篡改
● cookie 可以用于攻击
● cookie 存储量很小。未来实际上要被 localStorage 替代,但是后者 IE9 兼容。
三、Cookie 的使用
获取cookies
简单使用案例:
cookie.js
let express = require('express');
let app = new express();
let cookieParser = require('cookie-parser');
app.use(cookieParser())
// 获取cookie
app.get('/',(req,res) => {
res.send(`获取到的cookie值为:${req.cookies.username}`)
})
// 本地设置cookie
app.get('/set',(req,res) => {
/*
参数1:存储变量
参数2:变量值
参数3:cookie的配置信息{maxAge:失效时间}
*/
res.cookie('username','muzidigbig',{maxAge:60000})
res.send('设置cookie成功')
})
app.listen(8010)
四、加密 Cookie(让用户看不到cookie明文信息的步骤)
1.配置中间件的时候需要传参
var cookieParser = require('cookie-parser');
//使用中间件的时候需要给参数,任意给
app.use(cookieParser('123456'));
2.设置 cookie 的时候配置 signed 属性为true
res.cookie('userinfo','hahaha',{domain:'.ccc.com',maxAge:900000,httpOnly:true,signed:true});
3. signedCookies 调用设置的 cookie
console.log(req.signedCookies);
案例:
signedCookie.js
let express = require('express');
let app = new express();
let cookieParser = require('cookie-parser');
//使用中间件的时候需要给参数,任意给(加密cookie)
app.use(cookieParser('123456'))
// 获取加密cookie
app.get('/',(req,res) => {
res.send(`获取到的cookie值为:${req.signedCookies.username}`)
})
// 本地设置加密cookie
app.get('/set',(req,res) => {
/*
参数1:存储变量
参数2:变量值
参数3:cookie的配置信息{maxAge:失效时间,domain:用来设置多个二级域名共享cookie(别外一个也可进行访问),signed:true(加密cookie)}
*/
res.cookie('username','muzidigbig1',{maxAge:6000000,signed:true})
res.send('设置cookie成功')
})
app.listen(8010)
cookie的应用案例:
功能:在/lvyou?citys=城市上面不断改变城市的名字进行访问,然后在/页面上就可以显示你访问过哪些城市
cookieUse.js
let express = require('express')
let app = new express()
let cookieParser = require('cookie-parser')
app.use(cookieParser())
app.get('/',(req,res) => {
res.send('您浏览过的城市: '+req.cookies.citys)
})
/**
* 您浏览过的城市:
* /lvyou?city=北京 /lvyou?city=上海 /lvyou?city=武汉 /lvyou?city=杭州
*/
app.get('/lvyou',(req,res) => {
let city = req.query.citys;//获取当前城市
let citys = req.cookies.citys;//数组,获取所有城市
if(citys){
citys.push(city)
}else{
citys = [];//没有浏览过任何城市的话,citys改为数组
citys.push(city)
}
res.cookie('citys',citys,{maxAge:9000000000})
res.send('您浏览的当前城市:'+city)
})
app.listen(8011)
效果: