cookie的工作原理
http是一種無狀態協議,設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。那個時候沒有動態頁面技術,只有純粹的靜態HTML頁面,因此根本不需要協議能保持狀態;
cookie是在RFC2109(已廢棄,被RFC2965取代)裏初次被描述的,每個客戶端最多保持三百個cookie,每個域名下最多20個Cookie(實際上一般瀏覽器現在都比這個多,如Firefox是50個),而每個cookie的大小爲最多4K,不過不同的瀏覽器都有各自的實現。對於cookie的使用,最重要的就是要控制cookie的大小,不要放入無用的信息,也不要放入過多信息。
無論使用何種服務端技術,只要發送回的HTTP響應中包含如下形式的頭,則視爲服務器要求設置一個cookie:
Set-cookie:name=name;expires=date;path=path;domain=domain
支持cookie的瀏覽器都會對此作出反應,即創建cookie文件並保存(也可能是內存cookie),用戶以後在每次發出請求時,瀏覽器都要判斷當前所有的cookie中有沒有沒失效(根據expires屬性判斷)並且匹配了path屬性的cookie信息,如果有的話,會以下面的形式加入到請求頭中發回服務端:
Cookie: name="zj"; Path="/linkage"
服務端的動態腳本會對其進行分析,並做出相應的處理,當然也可以選擇直接忽略。
這裏牽扯到一個規範(或協議)與實現的問題,簡單來講就是規範規定了做成什麼樣子,那麼實現就必須依據規範來做,這樣才能互相兼容,但是各個實現所使用的方式卻不受約束,也可以在實現了規範的基礎上超出規範,這就稱之爲擴展了。無論哪種瀏覽器,只要想提供cookie的功能,那就必須依照相應的RFC規範來實現。所以這裏服務器只管發Set-cookie頭域,這也是HTTP協議無狀態性的一種體現。
需要注意的是,出於安全性的考慮,cookie可以被瀏覽器禁用。
//轉載於http://www.cnblogs.com/chenchenluo/p/4197181.html
express直接提供了api,只需要在需要使用的地方調用如下api即可
function(req, res, next){
...
res.cookie(name, value [, options]);
...
}
express就會將其填入Response Header中的Set-Cookie,達到在瀏覽器中設置cookie的作用。
name: 類型爲String
value: 類型爲String和Object,如果是Object會在cookie.serialize()之前自動調用JSON.stringify對其進行處理
Option: 類型爲對象,可使用的屬性如下
domain:cookie在什麼域名下有效,類型爲String,。默認爲網站域名
expires: cookie過期時間,類型爲Date。如果沒有設置或者設置爲0,那麼該cookie只在這個這個session有效,即關閉瀏覽器後,這個cookie會被瀏覽器刪除。
httpOnly: 只能被web server訪問,類型Boolean,禁止客戶端JavaScript的訪問,禁止後不能使用document.cookie。
maxAge: 實現expires的功能,設置cookie過期的時間,類型爲String,指明從現在開始,多少毫秒以後,cookie到期。
path: cookie在什麼路徑下有效,默認爲’/’,類型爲String
secure:只能被HTTPS使用,類型Boolean,默認爲false
signed:使用簽名,類型Boolean,默認爲false。express會使用req.secret來完成簽名,需要cookie-parser配合使用
下面一段代碼用於設置cookie:
var express=require('express');
var cookie=require('cookie-parser');
var app=express();
app.use(cookie());
app.get('/',function(req,res){
if(req.cookies.user){
res.send('歡迎在次登錄')
}
else{
res.cookie('user',1,{ expires: new Date(Date.now() + 100), httpOnly: true });
res.send('歡迎新用戶登錄')
}
});
app.listen(8888);
我們注意到在第一次登錄時,在請求的response頭部會出現set-cookie。對應的在server.js中我們手動設置的cookie。
再打開瀏覽器查看此時的瀏覽器cookie。
再次刷新頁面。
在請求的請求頭中出現cookie,此時頁面出現歡迎在次登錄
這樣一個簡單的服務端設置cookie就搞定了。