1.Cookie
1.1. cookie
HTTP是无状态的链接, 你请求一个网页结束以后,此时你和服务器之间没有任何关系了,没有数据持续通路,下一次访问,服务器是不知道你来过的
所以在HTTP最初的版本,就设计了一个cookie的东西,
简单理解就是服务器在response的响应头中设置一个set-cookie的报文头,用于在访问的浏览器上设置cookie
然后浏览器每次访问这个服务器的时候,都要带着cookies字段上去
app.get("/",function(req,res){
res.cookie("a",10,{maxAge:900000,httpOnly:true});
res.send("首页 ")
})
今后对于这个域名的访问,不管端口是什么都会带着cookie上去, 然后服务器通过的到的cookie信息来比较判断你是否是上次来过的人
1.2. 读取cookie
1.2.1 通过请求头来获取cookie信息
cookie是通过请求头抬过来的,那么我们可以通过请求头获取 不过我们获取的是字符串,我们需要自己处理成为对象
app.get("/index",(req,res,next) => {
res.cookie("username","wuwei",{path:'/',maxAge: 60* 1000})
console.log(req.headers.cookie)
res.send("首页")
})
1.2.2 利用第三方模块获取cookie信息
我们可以使用第三方模块cookie-parser,这个包就是用来格式化cookie的显示,只有装了这个依赖之后,服务器才能更好的读取cookie
cookie-parse是一个中间件,可以通过use去使用
const cookieparser = require("cookie-parser")
app.use(cookieparser())
然后就可以通过req.cookies()拿到这个数据
app.get("/",function(req,res){
console.log(req.cookies); // 会自动键值对的形式{a:10}
res.send("首页 ")
})
1.3. cookie的问题
cookie的缺点: 就是不安全,(cookie 可以自由被篡改,并且是铭文保存的) 所以要不就是通过加密处理,或者我们可以使用session
2.Session
session依赖cookie,是一种特殊的cookie,通常用于制作登录验证
session需要是用一个express-session中间件
var session = require("express-session")
配置session
app.use(session({
secret: 'keyboard cat', // 加密字符串会通过这个字符串进行加密
cookie: {maxAge:6000}, // 设置过期时间
resave: true, // 即时session 没有被修改, 也保存session值, 默认为true
saveUninitialized:true, // 无论有没有session cookie 每次请求都设置个session cookie 默认标示为 connect.sid
rolling: true // 属性cookie的时间
}))
使用session
app.get("/",function(req,res){
if(!req.session.a){
req.session.a = Math.random()*1000
}
res.send("随机数是"+req.ression.a)
})
使用session的时候服务器会在内存中(内存条,不是硬盘,不是数据库)缓存你的一些信息,哈希结构(hash结构,k-v对结构),然后通过cookie发给前端一个乱码,持有这个cookie乱码的人访问这个服务器,服务器会通过乱码匹配拿到这个用户在内存中缓存的值,服务器就只到你的值是多少
session的读和设都在req上
3. Koa Cookie的使用
3.1 Koa中设置 Cookie的值
语法
ctx.cookies.set(name,value,[options])
参数
- name: cookie的名称
- value: cookie的值
- options: 可选 cookie配置
options 配置
options 名称 | opotions 值 |
---|---|
maxAge | 从当前到过期的毫秒数(数字) |
expires | cookie的过期时间(Date) |
path | cookie 路径 默认是 '/' |
domain | cookie 域名 |
secure | 安全cookie, 默认为false, 设置true,表示只有https可以访问 |
httpOnly | 是否只是服务器可访问cookie |
3.2 Koa 中获取 Cookie的值
语法
ctx.cookies.get(name)
参数
- name: cookie的名称
注意,Koa中没法直接设置中文的Cookie
解决方案:
- 设置cookie的时候,可以通过将中文转为buffer在转为base64的字符串, 设置cookie
- 获取cookie 在base64的字符串转为buffer在转为普通字符
4. Koa session使用
session 是另一种记录客户端状态的机制, 不同的是Cookie保存在客户端浏览器中, 而Session 保存在服务器上
4.1 Session的使用流程
当浏览器访问服务器并发送第一次请求时, 服务端创建一个session对象,生成一个类似于key,value的键值对,然后将key(cookie)返回到浏览器(客户)端,浏览器下次在访问时,携带key(cookie), 找到对应的session(value). 客户的信息都保存在session中
4.2 安装使用
1.安装session
$ npm install koa-session --save
2.引入session
const session = require("koa-session")
3.配置session中间件
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa:sess', /** cookie的key。 (默认是 koa:sess) */
maxAge: 86400000, /** session 过期时间,以毫秒ms为单位计算 。*/
autoCommit: true, /** 自动提交到响应头。(默认是 true) */
overwrite: true, /** 是否允许重写 。(默认是 true) */
httpOnly: true, /*表示是否可以通过javascript来修改,设成true会更加安全*/
signed: true, /** 是否签名。(默认是 true) */
rolling: false, /** 是否每次响应时刷新Session的有效期。(默认是 false) */
renew: false, /** 是否在Session快过期时刷新Session的有效期。(默认是 false) */
};
app.use(session(CONFIG, app));
4.使用session
// 设置session
ctx.session.username = 'XXX'
// 获取session
ctx.session.username
网友评论