koa2如何設定和清除cookie?

weixin_34146805發表於2017-11-28
2976869-4d3c800b7fff82ef.png

推薦一部電影,非常公寓,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')
2976869-bf5fb27cd4d58ee0.png

expires/Max-Age 欄位為此cookie超時時間。若設定其值為一個時間,那麼當到達此時間後,此cookie失效。不設定的話預設值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標籤頁,而是整個瀏覽器) 後,此cookie失效。

2.瀏覽器如何將cookie儲存?(根據後端設定決定儲存與否,需要在cookie有效期內)
根據expires/MAX-AGE來儲存。
現在的cookie生存週期只是一個session,也就是整個瀏覽器會話(單個tab標籤頁關閉Cookie依舊儲存)
首次建立會話,只有response headers中有cookie.

2976869-c0ff495ca4167bfb.png

第二次建立會話,request headers中也有cookie

2976869-2fb75a9bfcd07ad3.png

3.如何設定expires?(後端設定,koa2,基於cookie.js模組)
可能需要依賴redis,可能需要 koa2。
先不管redis,使用koa2來修改cookie有效時間。
先嚐試原生方式,沒有原生方式。
koa2方式成功。

2976869-b318668514424bb9.png

2976869-f0b3314ac0576f01.png

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 !

相關文章