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 !
相關文章
- 如何設定cookie和刪除cookieCookie
- 如何設定CookieCookie
- postman如何設定cookiePostmanCookie
- 新增cookie、刪除cookie、清除cookieCookie
- 如何清除Safari,Chrome和Firefox中的快取,歷史記錄和CookieChromeFirefox快取Cookie
- cookie的設定Cookie
- cookie的設定、獲取和刪除Cookie
- js清除所有的cookieJSCookie
- python flask 設定cookiePythonFlaskCookie
- Mac電腦如何設定自動清除廢紙簍?Mac
- Python Flask,cookie,設定、獲取、刪除cookiePythonFlaskCookie
- Cookie設定HttpOnly屬性CookieHTTP
- Mac新手教程:Mac廢紙簍如何設定自動清除?Mac
- JavaScript設定cookie立即過期JavaScriptCookie
- JavaScript 設定cookie 過期時間JavaScriptCookie
- 瀏覽器手動設定Cookie瀏覽器Cookie
- 谷歌瀏覽器檢視和手動設定cookie的值谷歌瀏覽器Cookie
- Android Studio 設定自動清除無效 importAndroidImport
- 利用js裡的Dom和Date,自定義cookie的前端設定方法JSCookie前端
- 純生JS輪播,定時器新增和清除定時器JS定時器
- JavaScript 設定Cookie過期時間無效JavaScriptCookie
- 看我如何用定值 Cookie 實現反爬Cookie
- Postman設定自動捕獲傳遞Cookie教程PostmanCookie
- cookie的值可以設定為中文嗎?為什麼?如果可以怎麼設定?Cookie
- 關於STM32的BSRR(埠位設定/清除暫存器) 和 BRR(埠位清除暫存器) 的理解(初學32)
- Python 設定 session 或 cookie 增、刪、改、查鍵值PythonSessionCookie
- MAC 下使用Postman設定Cookie來發起請求MacPostmanCookie
- Cookie 作用,互動過程解析,設定,獲取,刪除,生效時間的設定Cookie
- Cookie和SessionCookieSession
- session和cookieSessionCookie
- cookie 和 sessionCookieSession
- Jquery如何獲取和設定元素內容?jQuery
- [cmake]如何設定Debug和Release編譯模式編譯模式
- 如何獲取Cookie並使用Cookie侵入Cookie
- 如何設定 HomePod?HomePod設定教程分享
- DataGridView清除顯示的資料、設定右鍵選單詳解View
- javascript怎麼清除所有定時器JavaScript定時器
- 如何設定 CORSCORS
- 如何設定vimrc?