koa2如何設置和清除cookie?


推薦一部電影,非常公寓,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 !

期待和大家交流,共同進步,歡迎大家加入我創建的與前端開發密切相關的技術討論小組:

努力成為優秀前端工程師!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容