nodejs-5.7 express-session

express-session
官網: https://github.com/expressjs/sessionhtml

★cookie 和 session 的區別:node

二者都一般用於保存用戶狀態用來驗證用戶身份;git

cookie 是存儲在瀏覽器端的.
session 是存儲在服務器端的.github

與cookie相比,用session來存儲用戶我的信息,cookie能夠看到用戶id之類的,而session在本地客戶端只能看到惟一的隨機字符串,相對來講比較安全(互聯網沒有絕對安全)。express

建議:將登錄信息等重要信息存放爲session、其餘信息若是須要保留,能夠放在cookie中npm

☆ nodejs 存儲 session 的位置, 是在內存中。每個登錄用戶對應一個 session 信息。瀏覽器


1. 安裝 cnpm install express-session --save安全


2. 引入並設置
  var session = require('express-session'); 服務器

  app.use(session({
    secret: 'dsfadsafdassadfasdf', //加密 ,必填參數
    resave: false, //選填參數 不加會報警告(重寫)
    //resave:true 強制將session數據進行重寫,反之亦然
    saveUninitialized: false, // 選填參數 不加會報警告(初始化)
    //saveUninitialized: false 用到session時纔會去初始化
    //saveUninitialized: true 無論用不用到session都會初始化
    cookie: { maxAge: 600000 },  //session 的實現是默認依賴 cookie
    name: 'niubibu'   //session名稱
  }));cookie

各參數意義:
secret:用來對session數據進行加密的字符串.這個屬性值爲必須指定的屬性。
name:表示cookie的name,默認cookie的name是:connect.sid。

cookie: 設置存放 session id 的 cookie 的相關選項,默認爲 (default: { path: '/’, httpOnly: true, secure: false, maxAge: null })       maxAge:cookie過時時間,毫秒。

resave:是指每次請求都從新設置session cookie,假設你的cookie是6000毫秒過時,每次請求都會再設置6000毫秒。
saveUninitialized: 是指不管有沒有session cookie,每次請求都設置個session cookie ,默認給個標示爲 connect.sid。

 

3.  設置session: req.session.username = 'lisi';

 獲取session: req.session.username

 用於銷燬session: req.session.destroy(function(err){ //console.log('shanchu') }) 

 

4. session原理:

nodejs 中, session 的實現是默認依賴 cookie。`HttpOnly` 聲明該cookie 只能用來進行網絡傳輸, 本地沒法操做該 cookie. 禁止瀏覽器修改 cookie

  • httpOnly:是微軟對COOKIE作的擴展。若是在COOKIE中設置了「httpOnly」屬性,則經過程序(JS腳本、applet等)將沒法讀取到COOKIE信息,防止XSS攻擊產生

 

5. 實例連接代碼

(1)session設置獲取

var express =require('express'); var session = require('express-session'); var app = express(); app.use(session({ secret: 'dsfadsafdassadfasdf', //加密 ,必填參數
  resave: false, //選填參數 不加會報警告(重寫)
  //resave:true 強制將session數據進行重寫,反之亦然
  saveUninitialized: false,// 選填參數 不加會報警告(初始化)
  //saveUninitialized: false 用到session時纔會去初始化 
  //saveUninitialized: true 無論用不用到session都會初始化 
  cookie: { maxAge: 600000 },//session 的實現是默認依賴 cookie
  name: 'niubibu' })); //設置靜態資源目錄
app.use(express.static('public')); app.set('view engine','ejs'); app.set('views','views'); //路由
app.get('/setSession', function(req,res){ //設置session
  req.session.username = 'admin'; res.end('set session'); }) //讀取session
app.get('/getSession', function(req, res){ console.log(req.session.username); res.end('get session'); }) app.listen(80);

 

(2) 模擬登錄操做設置session驗證明例:

需求:

// GET /home 網站首頁 /detail 商品詳情頁 不須要登錄
// GET /admin 網站後臺 必需要登錄   驗證session
// GET /login 顯示登錄頁面
// POST /login 檢測用戶參數 帳號:admin 密碼:admin   登錄成功設置session

var express =require('express'); var session = require('express-session'); var formidable = require('formidable'); var app = express(); app.set('view engine','ejs'); app.set('views','views'); app.use(session({ secret: 'dsfadsafdassadfasdf', //加密 ,必填參數
  resave: false, //選填參數 不加會報警告(重寫)
  //resave:true 強制將session數據進行重寫,反之亦然
  saveUninitialized: false,// 選填參數 不加會報警告(初始化)
  //saveUninitialized: false 用到session時纔會去初始化 
  //saveUninitialized: true 無論用不用到session都會初始化 
  cookie: { maxAge: 600000 },//session 的實現是默認依賴 cookie
  name: 'niubibu'//session名稱
})); // GET /home 網站首頁 /detail 商品詳情頁 不須要登錄 // GET /admin 網站後臺 必需要登錄 // GET /login 顯示登錄頁面 // POST /login 檢測用戶參數 帳號:admin 密碼:admin

//首頁
app.get('/home', function(req,res){ res.setHeader('content-type','text/html;charset=utf-8'); res.end('網站首頁!!!'); }); //詳情頁
app.get('/detail', function(req,res){ res.setHeader('content-type','text/html;charset=utf-8'); res.end('商品詳情頁!!!'); }); //後臺首頁
app.get('/admin', function(req,res){ //檢測用戶的身份 設置session:admin=1&id=19
  if(req.session.admin == 1 && req.session.id) { res.setHeader('content-type','text/html;charset=utf-8'); res.end('網站後臺!!!'); return; } res.redirect('/login'); }); //顯示登錄
app.get('/login', function(req, res){ res.render('login'); }); //登錄操做
app.post('/login', function(req, res){ //獲取用戶參數
  var form = new formidable.IncomingForm(); form.parse(req, function(err, fields, files) { //判斷
      if(fields.username == 'admin' && fields.password == 'admin'){ res.setHeader('content-type','text/html;charset=utf-8'); //登錄成功
        //寫入session
        req.session.admin = 1; req.session.id = 20; //3秒後跳轉後臺頁面:第一種方法
        // res.redirect('/admin');
        // res.end(`登錄成功<script>setTimeout(function(){
        // location.href= "/admin";
        // },3000)</script>`);
        // 
        //3秒後跳轉後臺頁面:第二種方法
        res.render('success',{info: '登錄成功', time: 10000, url: '/admin'}); } else { res.redirect('/login'); } }); }); //設置靜態資源目錄
app.use(express.static('public')); app.set('view engine','ejs'); app.set('views','views'); app.listen(80);
app2.js
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登錄頁面</title>
</head>
<body>
  <form action="/login" method="POST">
    <input type="text" name="username">
    <input type="text" name="password">
    <button>登錄</button>
  </form>
</body>
</html>
login.ejs
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title><%= info %></title>
</head>
<body>
  <h1 style="font-size:50px"> :) </h1>
  <h2><%= info %></h2>  
  <p><%= time/1000 %> 秒以後跳轉</p>

  <script> setTimeout(function(){ location.href = '<%= url %>'; }, <%= time %>); </script>
</body>
</html>
success.ejs
相關文章
相關標籤/搜索