session是基於cookie實現的,session在被建立後,會生成一個惟一的sessionid返回給瀏覽器, 並保存在瀏覽器的cookie中,接下來客戶再次調用服務端接口,服務器便會從客戶端發送過來的cookie中查找name爲sessionid的cookie是否存在,如果存在則經過該cookie的值來找到用戶以前建立的session,如果不存在則建立一個新的session。前端
然而保存sessionId的cookie默認是會話級別的,是保存在瀏覽器的內存中的,當瀏覽器關閉時這個cookie也就消失了,因此再次打開一個新的瀏覽器因爲這個時候並不存在名爲sessionid的cookie,因此服務器便會建立一個新的session,可是原來的session仍是存在的!也就是說 這時候服務器中一共存在兩個session。mysql
設置cookie的過時時間,必須關閉瀏覽器的隨瀏覽器關閉而清除cookie的功能sql
可是cookie也能夠設置過時時間,不設置的話默認隨着瀏覽器的關閉而清楚,由於未設置過時時間的cookie只能存在瀏覽器,設置過時時間的話就會存到本地硬盤上,瀏覽器關閉就不影響cookie(除非到了過時時間它自動清除),這個時候當瀏覽器再次打開,會從本地讀取cookie,發送給服務端,在重複執行過程一。這個可用於必定時間內免用戶登陸的需求等數據庫
session也有過時時間,默認爲20分鐘,20分鐘後自動清除session。當session過時後,瀏覽器發送過來的cookie就沒法在服務器端找到對應的session,由於session已經不存在,此時須要從新登陸並設置session,重複過程一瀏覽器
在週報登陸中,使用的是koa-session-minimal
和koa-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是隨着瀏覽器關閉而關閉,只有在maxAge值大於0時,cookie和session的過時時間保持一致爲maxAge
的值。