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
的值。