推薦一部電影,非常公寓,1996年愛情懸疑片,特好看。
再吐槽一句,還有好長的路要走啊...
言歸正傳!
先看一個很關鍵的問題。
問:
cookie與cookie中的session是什么?
答:
cookie是一種報文頭信息,請求報文和響應報文中都可以有cookie,key-value的形式,主要用來識別用戶身份。
cookie中的session是指會話,瀏覽器會話是指瀏覽器與服務器建立一次會話,關閉瀏覽器使得會話結束,此時session與cookie同時失效。與cookie有關的session,是指expires,默認為session,也就是cookie有效期,會話結束cookie失效。
樸靈大神的《深入淺出nodejs》中對cookie進行了很精辟的講解:
由于HTTP是無狀態協議,所以需要cookie來區分用戶之間的身份。最新規范RFC6265中,定義cookie是一個由瀏覽器和服務器共同協作實現的規范。
Cookie的處理分為以下幾步:
1.服務器向客戶端發送cookie(我說怎么前端很少會用到cookie...)
2.瀏覽器將Cookie保存(后端設置expires或者maxAge,cookie有效期由后端來決定,默認為session)
3.之后每次瀏覽器都會講Cookie發向服務器。(有效期內是這樣)
客戶端發送的Cookie在請求報文的Cookie字段中,我們可以使用curl來構造這個字段,如下所示:
curl -v -H "Cookie:foo=bar;baz=val" "http://127.0.0.1:1337/path?foo=bar&foo=baz"
構建失敗,不過由此催生出一個有趣的問題。
1.后端如何生成cookie(后端原生nodejs)
搭建一個http服務器,并且手動生成cookie,保存到瀏覽器。
var http = require('http')
http.createServer(function(req,res){
res.setHeader('Set-Cookie',['name=frank','age=23'])
res.writeHead(400,{'Content-Type':'text/plain'});
res.end('Hello World\n')
}).listen(1337,'127.0.0.1')
expires/Max-Age 字段為此cookie超時時間。若設置其值為一個時間,那么當到達此時間后,此cookie失效。不設置的話默認值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標簽頁,而是整個瀏覽器) 后,此cookie失效。
2.瀏覽器如何將cookie保存?(根據后端設置決定保存與否,需要在cookie有效期內)
根據expires/MAX-AGE來保存。
現在的cookie生存周期只是一個session,也就是整個瀏覽器會話(單個tab標簽頁關閉Cookie依舊保存)
首次建立會話,只有response headers中有cookie.
第二次建立會話,request headers中也有cookie
3.如何設置expires?(后端設置,koa2,基于cookie.js模塊)
可能需要依賴redis,可能需要 koa2。
先不管redis,使用koa2來修改cookie有效時間。
先嘗試原生方式,沒有原生方式。
koa2方式成功。
cookie有效期已經不再是session了。
代碼如下:
const setCookie = ctx => {
data = ctx.request.body;
ctx.response.body = "Cookie設置成功"
ctx.cookies.set('name', 'frank', { signed: true ,maxAge:7200000});
ctx.cookies.set('age', 23, { signed: true ,maxAge:7200000});
ctx.body = 'Hello World';
};
app.use(route.get('/set', setCookie))
既然設置了cookie,服務器如何清除cookie呢?
我們清除的是瀏覽器上的cookie,讓cookie過期就好。
設置cookie的值為空,并且設置cookie的maxAge為0,或者Expires設置為當前時間前的一個時間,例如當前時間1毫秒前Date.now()-1。
koa2框架清除cookie的具體操作代碼為:
const deleteCookie = ctx =>{
ctx.response.body = "Cookie刪除成功"
ctx.cookies.set('name','',{signed:false,maxAge:0})
ctx.cookies.set('age','',{signed:false,maxAge:0})
ctx.body = "Hello orld"
}
app.use(route.get('/delete',deleteCookie)
完整的koa2設置cookie,清除cookie代碼示例如下:
const koa = require('koa');
const app = new koa();
app.keys = ['im a newer secret', 'i like turtle'];
// app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');
const route = require('koa-route');
const setCookie = ctx => {
data = ctx.request.body;
ctx.response.body = "Cookie設置成功"
ctx.cookies.set('name', 'frank', { signed: true ,maxAge:7200000});
ctx.cookies.set('age', 23, { signed: true ,maxAge:7200000});
ctx.body = 'Hello World';
};
app.use(route.get('/set', setCookie))
const deleteCookie = ctx =>{
ctx.response.body = "Cookie刪除成功"
ctx.cookies.set('name','',{signed:false,maxAge:0})
ctx.cookies.set('age','',{signed:false,maxAge:0})
ctx.body = "Hello orld"
}
app.use(route.get('/delete',deleteCookie))
app.listen(3000);
That it !
期待和大家交流,共同進步,歡迎大家加入我創建的與前端開發密切相關的技術討論小組:
- SegmentFault技術圈:ES新規范語法糖
- SegmentFault專欄:趁你還年輕,做個優秀的前端工程師
- 知乎專欄:趁你還年輕,做個優秀的前端工程師
- Github博客: 趁你還年輕233的個人博客
- 前端開發QQ群:660634678
微信公眾號: 人獸鬼 / excellent_developers
努力成為優秀前端工程師!