登陸有關的session和cookie(後臺)

關於session和cookie基礎介紹:

session和cookie關係

session是基於cookie實現的,session在被建立後,會生成一個惟一的sessionid返回給瀏覽器, 並保存在瀏覽器的cookie中,接下來客戶再次調用服務端接口,服務器便會從客戶端發送過來的cookie中查找name爲sessionid的cookie是否存在,如果存在則經過該cookie的值來找到用戶以前建立的session,如果不存在則建立一個新的session。前端

然而保存sessionId的cookie默認是會話級別的,是保存在瀏覽器的內存中的,當瀏覽器關閉時這個cookie也就消失了,因此再次打開一個新的瀏覽器因爲這個時候並不存在名爲sessionid的cookie,因此服務器便會建立一個新的session,可是原來的session仍是存在的!也就是說 這時候服務器中一共存在兩個sessionmysql

設置cookie的過時時間,必須關閉瀏覽器的隨瀏覽器關閉而清除cookie的功能sql

cookie過時時間

可是cookie也能夠設置過時時間,不設置的話默認隨着瀏覽器的關閉而清楚,由於未設置過時時間的cookie只能存在瀏覽器,設置過時時間的話就會存到本地硬盤上,瀏覽器關閉就不影響cookie(除非到了過時時間它自動清除),這個時候當瀏覽器再次打開,會從本地讀取cookie,發送給服務端,在重複執行過程一。這個可用於必定時間內免用戶登陸的需求等數據庫

session過時時間

session也有過時時間,默認爲20分鐘,20分鐘後自動清除session。當session過時後,瀏覽器發送過來的cookie就沒法在服務器端找到對應的session,由於session已經不存在,此時須要從新登陸並設置session,重複過程一瀏覽器

結合具體項目代碼談談:

項目具體代碼

在週報登陸中,使用的是koa-session-minimalkoa-mysql-session中間件,先貼代碼:服務器

const config = require('../config/default');        // 數據庫相關的配置文件
const session = require('koa-session-minimal');         // 處理數據庫中間件
const MysqlStore = require('koa-mysql-session');    // 處理數據庫中間件

let createSession = (app) => {
  // session數據庫存儲配置
  const sessionMysqlConfig= {
    user: config.database.USERNAME,
    password: config.database.PASSWORD,
    database: config.database.DATABASE,
    host: config.database.HOST,
    port: config.database.PORT
  };

  // session/cookie 屬性配置
  let sessionOptions = {
    key: 'session-id',              // cookie 中存儲 session-id 時的鍵名, 默認爲 koa:sess
    cookie: {                       // 與 cookie 相關的配置
      domain: '',                   // 寫 cookie 所在的域名
      path: '/',                    // 寫 cookie 所在的路徑
      maxAge: 1000 * 60 * 10,       // cookie 有效時長(單位:ms)
      httpOnly: true,               // 是否只用於 http 請求中獲取
      overwrite: true               // 是否容許重寫
    },
    store: new MysqlStore(sessionMysqlConfig)
  };

  app.use(async (ctx, next) => {
    // 獲取hostname,設置cookie的domain屬性值
    sessionOptions.cookie.domain = ctx.request.hostname;
    await next();
  });

  app.use(session(sessionOptions));
};


module.exports = createSession;

在每次用戶登陸的時候,都會設置session:cookie

ctx.session = {
    userId: '???'
};

存儲session的時候就會經過這個文件中的配置,給設置的數據庫中添加一個名字爲_mysql_session_store的表並存儲下面的數據:session

id: 'session-id:自動生成的序列號',expires: 'session設置的過時時間',data: '登陸時存儲的值'

同時向前端返回值爲session-id的cookie,並存在客戶端,每次請求時都會將cookie同時發送給服務端,咱們只在每次請求時判斷ctx.session.userId是否存在,能取到則是sessio存在且未過時,則能夠繼續執行相應操做app

注意:dom

其實在取值時中間件已經幫咱們作了不少工做:進行這一步時候中間件先是經過客戶端發過來的cookie對應的值去找數據庫中對應的數據,若是存在且未過時的話則返回對應的data,即本文中的userId

關於這個中間件中session和cookie的過時時間:

中間件中默認session過時時間爲一天,cookie是隨着瀏覽器關閉而關閉,只有在maxAge值大於0時,cookie和session的過時時間保持一致爲maxAge的值。

相關文章
相關標籤/搜索