node的express中間件之session

 

雖然session與cookie是分開保存的.可是session中的數據通過加密處理後默認保存在一個cookie中.所以在使用session中間件以前必須使用cookieParser中間件.javascript

app.use(express.session([options]));html

options參數的具體取值:java

key:字符串,用於指定用來保存session的cookie名稱,默認爲coomect.sid.express

store:屬性值爲一個用來保存session數據的第三方存儲對象.服務器

fingerprint:屬性值爲一個自定義指紋生成函數.cookie

cookie:屬性值爲一個用來指定保存session數據的cookie設置的對象,默認值爲{path:"/",httpOnly:true,maxAge:14400000}.session

    path是cookie保存路徑.httpOnly是否只針對http保存cookie,app

    maxAge用於指定cookie的過時時間,單位爲毫秒.函數

secret:字符串.用來對session數據進行加密的字符串.這個屬性值爲必須指定的屬性.post

在使用了session中間件後,表明客戶端請求的http.IncomingMessage對象就具備了一個session屬性.該屬性保存了全部session數據.

 

 1 var express=require("express");
 2 var app=express();
 3 app.use(express.cookieParser());
 4 app.use(express.session({secret:"test"}));
 5 app.get("/index.html", function (req,res) {
 6     res.sendfile(__dirname+"/index.html");
 7     req.session.username="思思博士";
 8     req.session.password="123456"
 9 });
10 
11 app.post("/index.html", function (req,res) {
12     res.write("用戶名:"+req.session.username+"<br/>");
13     res.write("密碼:"+req.session.password);
14     res.end();
15 });
16 
17 app.listen(1337,"127.0.0.1", function () {
18     console.log("開始監聽:1337");
19 });

 

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>session中間件的使用</title>
 6     <script type="text/javascript">
 7         function getSession(){
 8             var xhr=new XMLHttpRequest();
 9             xhr.open("post","index.html",true);
10             xhr.onload= function () {
11                 if(this.status=200){
12                     document.getElementById("res").innerHTML=this.response;
13                 }
14             };
15             xhr.send();
16         }
17     </script>
18 </head>
19 <body>
20 <input type="button" value="提交" onclick="getSession();" />
21 <div id="res"></div>
22 </body>
23 </html>

 

能夠使用session屬性對象的regenerate方法從新生成一個session管理器.

req.session.regenerate(function(err){

});

修改服務器端代碼:

 1 var fs=require("fs");
 2 var express=require("express");
 3 var app=express();
 4 app.use(express.cookieParser());
 5 app.use(express.session({secret:"test"}));
 6 app.get("/index.html", function (req,res) {
 7     res.writeHead(200,{"Content-Type":"text/html"});
 8     res.write("<head><meta charset='utf-8' /><title>session中間件的簡單使用事例</title></head>");
 9     var file=fs.createReadStream("index.html");
10     req.session.username="思思博士";
11     req.session.password="123456";
12     req.session.regenerate(function (err) {
13         if(err) console.log("session從新初始化失敗.");
14         else console.log("session被從新初始化.");
15     });
16     file.pipe(res);
17 });
18 app.post("/index.html", function (req,res) {
19     res.write("用戶名:"+req.session.username+"<br/>");
20     res.write("密碼:"+req.session.password);
21     res.end();
22 });
23 app.listen(1337,"127.0.0.1", function () {
24     console.log("開始監聽:1337");
25 });

或者:

 1 var fs=require("fs");
 2 var express=require("express");
 3 var app=express();
 4 app.use(express.cookieParser());
 5 app.use(express.session({secret:"test"}));
 6 app.get("/index.html", function (req,res) {    
 7     res.sendfile(__dirname+"/index.html");
 8     req.session.username="思思博士";
 9     req.session.password="123456";
10     req.session.regenerate(function (err) {
11         if(err) console.log("session從新初始化失敗.");
12         else console.log("session被從新初始化.");
13     });   
14 });
15 app.post("/index.html", function (req,res) {
16     res.write("用戶名:"+req.session.username+"<br/>");
17     res.write("密碼:"+req.session.password);
18     res.end();
19 });
20 app.listen(1337,"127.0.0.1", function () {
21     console.log("開始監聽:1337");
22 });

 

 

單擊按鈕後.獲取的都是undefind了.

 

利用session的destroy方法銷燬在用的session管理器,當服務器接收到下一個請求時,將從新生成一個session管理器.

req.session.destroy(function(err){

});

 1 var fs=require("fs");
 2 var express=require("express");
 3 var app=express();
 4 app.use(express.cookieParser());
 5 app.use(express.session({secret:"test"}));
 6 app.get("/index.html", function (req,res) {
 7     res.sendfile(__dirname+"/index.html");
 8     req.session.username="思思博士";
 9     req.session.password="123456";
10     req.session.destroy(function (err) {
11         if(err) console.log("session銷燬失敗.");
12         else console.log("session被銷燬.");
13     });
14 });
15 app.post("/index.html", function (req,res) {
16     res.write("用戶名:"+req.session.username+"<br/>");
17     res.write("密碼:"+req.session.password);
18     res.end();
19 });
20 app.listen(1337,"127.0.0.1", function () {
21     console.log("開始監聽:1337");
22 });

 

設置過時時間:

maxAge屬性值來設置用於保存session數據的cookie過時時間或獲取該cookie的剩餘時間.

 1 var fs=require("fs");
 2 var express=require("express");
 3 var app=express();
 4 app.use(express.cookieParser());
 5 app.use(express.session({secret:"test"}));
 6 app.get("/index.html", function (req,res) {
 7     res.sendfile(__dirname+"/index.html");
 8     var long=30*1000;
 9     req.session.cookie.expires=new Date(Date.now()+long);
10     req.session.cookie.maxAge=long;
11     setInterval(function () {
12         console.log("cookie剩餘時間:"+req.session.cookie.maxAge);
13     },1000);
14 });
15 app.listen(1337,"127.0.0.1", function () {
16     console.log("開始監聽:1337");
17 });

 

每一秒顯示一個過時時間

相關文章
相關標籤/搜索