登陆有关的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的值。

相关文章
相关标签/搜索