雖然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 });
每一秒顯示一個過時時間