Cookie 簡介
cookie 是存儲於訪問者的計算機中的變量。可以讓我們用同一個瀏覽器訪問同一個域 名的時候共享數據。
HTTP 是無狀態協議。簡單地說,當你瀏覽了一個頁面,然后轉到同一個網站的另一個頁 面,服務器無法認識到這是同一個瀏覽器在訪問同一個網站。每一次的訪問,都是沒有任何 關系的。
Cookie的使用場景有很多比如:保存用戶信息,瀏覽器歷史記錄,猜你喜歡的功能,10天免登陸,多個頁面之間的數據傳遞,cookie實現購物車功能
Koa Cookie 的使用
不需要安裝第三方模塊,可以直接在Koa 中設置 Cookie 的值
ctx.cookies.set(name,value,[options])
通過options 設置 cookie name 的value
maxAge:一個數字表示從 Date.now() 得到的毫秒(就是說cookie的有效時長)
expires: cookie 過期的Date(就是說這個cookie到某個日期時間就到期)
path:cookie 路徑, 默認是'/' ,如果設置了其它,比如/news表示當訪問/news的時候才設置這個cookies
domain:cookie 域名,正常情況下不要設置,當有很多個子域名的時候可以這樣設置.baidu.com(這樣表示baidu.com下的子域名,比如a.baidu.com或者b.baidu.com都可以)
secure:安全 cookies 默認 false,設置成 true 表示 只有 https 可以訪問
httpOnly:是否只是服務器可訪問 cookies, 默認是true
overwrite :一個布爾值,表示是否覆蓋以前設置的同名 的 cookies(默認是 false). 如果是 true, 在同 一個請求中設置相同名稱的所有 Cookies(不 管路徑或域)是否在設置此 Cookies 時從 Set-Cookie 標頭中過濾掉。
設置cookies和獲取cookies
創建node應用app.js和index.html和news.html模板
let Koa = require('koa')
let router = require('koa-router')()
const render = require('koa-art-template');
const path = require('path');
var app = new Koa()
//配置 koa-art-template模板引擎
render(app, {
root: path.join(__dirname, 'views'), // 視圖的位置
extname: '.html', // 后綴名
debug: process.env.NODE_ENV !== 'production' //是否開啟調試模式
});
router.get('/',async (ctx)=>{
ctx.cookies.set('userinfo', 'zhangsan', {
maxAge:60*1000*60
});
let list = {
name: '張三'
}
await ctx.render('index',{
list:list
});
})
router.get('/news',async (ctx)=>{
var userinfo = ctx.cookies.get('userinfo');
console.log(userinfo);
let app = {
name: '張三11',
userinfo: userinfo
};
await ctx.render('news',{
list: app
});
})
app.use(router.routes()); /*啟動路由*/
app.use(router.allowedMethods());
app.listen(3000);
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2 class="title">這是一個index頁面</h2> <br/> <h2>綁定數據</h2> {{list.name}} </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2 class="title">這是一個news頁面</h2> <br/> <h2>綁定數據</h2> {{list.name}} <h2>Cookies</h2> {{list.userinfo}} </body> </html>
啟動服務后,瀏覽器訪問/根路由可以看到設置cookies成功

訪問/news路由,獲取cookies

其它options 設置
let Koa = require('koa')
let router = require('koa-router')()
const render = require('koa-art-template');
const path = require('path');
var app = new Koa()
//配置 koa-art-template模板引擎
render(app, {
root: path.join(__dirname, 'views'), // 視圖的位置
extname: '.html', // 后綴名
debug: process.env.NODE_ENV !== 'production' //是否開啟調試模式
});
router.get('/',async (ctx)=>{
ctx.cookies.set('userinfo', 'zhangsan', {
maxAge:60*1000*60,
path: '/news', //這里表示當我訪問/news這個路由(頁面)的時候才設置這個cookies
httpOnly: false
});
let list = {
name: '張三'
}
await ctx.render('index',{
list:list
});
})
router.get('/news',async (ctx)=>{
var userinfo = ctx.cookies.get('userinfo');
console.log(userinfo);
let app = {
name: '張三11',
userinfo: userinfo
};
await ctx.render('news',{
list: app
});
})
app.use(router.routes()); /*啟動路由*/
app.use(router.allowedMethods());
app.listen(3000);
重啟服務后,運行,當訪問到/頁面的時候,沒有設置cookies了,獲取cookies也是為空的,訪問/news的時候才設置cookies,設置了httpOnly的值為false,那么前端也可以獲取到cookies


可以看到當訪問/news路由(頁面)時,前端可以使用document.cookie獲取到cookies
Koa 中設置中文 Cookie
當設置Cookie的時候,如果有中文,運行匹配到路由后后台程序就報錯了:argument value is invalid
在koa中沒有直接設置中文的 ,需要自己在設置cookies(轉換成base64字符 串)和獲取cookies(還原base 64字符串)
let Koa = require('koa')
let router = require('koa-router')()
const render = require('koa-art-template');
const path = require('path');
var app = new Koa()
//配置 koa-art-template模板引擎
render(app, {
root: path.join(__dirname, 'views'), // 視圖的位置
extname: '.html', // 后綴名
debug: process.env.NODE_ENV !== 'production' //是否開啟調試模式
});
router.get('/',async (ctx)=>{
//koa中沒法直接設置中文的cookie,需要進行
var userinfo = new Buffer('胡椒粉').toString('base64'); // 轉換成base64字符串,類似:aGVsbG8sIHdvcmxkIQ==
ctx.cookies.set('userinfo', userinfo, {
maxAge:60*1000*60
});
let list = {
name: '張三',
}
await ctx.render('index',{
list:list
});
})
router.get('/news',async (ctx)=>{
var data = ctx.cookies.get('userinfo');
var userinfo= new Buffer(data, 'base64').toString()// 還原base 64字符串
console.log(userinfo);
let app = {
name: '張三11',
userinfo: userinfo
};
await ctx.render('news',{
list: app
});
})
app.use(router.routes()); /*啟動路由*/
app.use(router.allowedMethods());
app.listen(3000);

運行后可以看到瀏覽器端存儲的cookies userinfo的值是一串看不懂的字符串,在訪問/news頁面獲取cookies 還原base 64字符串

