Express教程06:Session(完結)

閱讀更多系列文章請訪問個人GitHub博客,示例代碼請訪問這裏

Session介紹

Session存儲在服務器,但它並不獨立使用,而是與Cookie或配合使用。mysql

也就是說,在Cookie中存儲了一個ID,服務端在接收到Cookie時對ID進行校驗,只有經過校驗才能夠進行下一步處理,不然將讓用戶從新登陸。git

Session相對單純的Cookie校驗而言比較安全,但也有可能發生Session劫持。github

使用cookie-session中間件操做Session

cookie-session介紹

cookie-session是經常使用來處理Session的中間件。爲了保證安全性,它是強制加密的。sql

安裝cookie-session

npm install cookie-session數據庫

使用cookie-session

示例代碼:/lesson06/server.jsexpress

同其餘中間件相似,cookie-session也只須要server.use方法調用,並傳入配置便可:npm

server.use(cookieSession({
  // 循環密鑰,其中有若干個密鑰。若是隻有一個密鑰,容易被客戶端破解,多個密鑰相對安全
  keys: [
    'tVnVq4zDhDtQPGPrx2qSOSdmuYI24C',
    'IUTEaA1wKoWnVDf4DspSBAjKvLWcyn',
    'yC7cWHZDYoRMYawxSVDdzKQdXkZ9sE',
    'Ikjk6OibzaBYiEM13Mrj8ITdb3DonG',
    'uyajLZWgim4BS4SuQtH4kbTi640mWo',
  ],
  // 設置20分鐘有效期,若Session丟失,過時後將沒法再被使用
  maxAge: 20 * 60 * 1000
}))
複製代碼

使用中間件後,在接口中對Session進行操做:瀏覽器

// 在接口中操做Session
server.get('/session', (req, res, next) => {
  console.log(`Session: ${JSON.stringify(req.session)}`)

  // 每次訪問/session接口,就將Session中的number值加1
  if (req.session.number) {
    req.session.number++
  } else {
    req.session.number = 1
  }

  // 存儲用戶ID
  req.session.id = 'lee'

  res.send(`Session: ${JSON.stringify(req.session)}`)
})
複製代碼

在瀏覽器中訪問http://localhost:8080/session,就能夠看到在頁面上打印出的Session值,如Session: {"number":1,"id":"lee"}安全

在瀏覽器的控制檯中能夠看到保存在Cookie中的Session值:bash

express:sess: eyJudW1iZXIiOjEsImlkIjoibGVlIn0=  // Session的值
express:sess.sig: 2wiwgJGBFBrNF4HuNSECtE39i8w // 對Session值的簽名,用來保護Session不被篡改
複製代碼

咱們能夠嘗試在控制檯中直接修改express:sessexpress:sess.sig的值,刷新後Session會由於校驗不經過而被重置。

服務端存儲Session

一般在項目開發中,也須要將Session保存在服務端,便於進行校驗。

此時可使用JavaScript庫如express-mysql-session,將Session保存在MySQL數據庫中。

相關文章
相關標籤/搜索