zoukankan      html  css  js  c++  java
  • session 原理

    session 原理

    session会话机制是⼀种服务器端机制,它使⽤类似于哈希表(可能还有哈希表)的结构来保存信息。

    实现原理:

    1. 服务器在接受客户端⾸次访问时在服务器端创建seesion,然后保存seesion(我们可以将seesion保存在内存中,也可以保存在redis中,推荐使⽤后者),然后给这个session⽣成⼀
      个唯⼀的标识字符串,然后在响应头中种下这个唯⼀标识字符串。
    2. 签名。这⼀步通过秘钥对sid进⾏签名处理,避免客户端修改sid。(⾮必需步骤)
    3. 浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息,
    4. 服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。

    如图:

    代码

    const http = require('http')
    // 存储sid
    const session = {}
    
    http.createServer((req, res)=> {
      const sessionKey = 'sid'
      // 获取cookie信息
      const cookie = req.headers.cookie
      console.log('cookie:', cookie)
    
      // 当cookie 存在 并且cookie 中有sid
      if(cookie && cookie.indexOf(sessionKey) > -1) {
        res.end(JSON.stringify({
          message: 'get cookie'
        }))
        // 读取 sid 值
        const pattern = new RegExp(`${sessionKey}=([^;]+);?s*`)
        const sid = pattern.exec(cookie)[1]
      
        console.log('session:', sid, session, session[sid])
      } else {
        // 利用随机数 创建一个sid
        const sid = (Math.random() * 99999999999).toFixed()
        // 将 sid 写入到 cookie
        res.setHeader('Set-Cookie', `${sessionKey}=${sid}`)
        // 将信息保存至session 对象
        session[sid] = { name: 'admin' }
        res.end(JSON.stringify({
          message: 'set cookie'
        }))
      }
    }).listen(3000)
    
  • 相关阅读:
    Python3.5 学习三
    心灵鸡汤20180727
    Python3.5 学习二
    spring心得4--setter注入集合(set、list、map、properties等多种集合,配有案例解析)@基本装(引用)
    drop user和drop user cascade的区别(转)
    数据库的导入 导出
    OracleDBConsole服务无法启动原因
    create XML
    C#里面Console.Write与Console.WriteLine有什么区别????
    将字符串 按照规定编码方式编码
  • 原文地址:https://www.cnblogs.com/wangyong1997/p/13722973.html
Copyright © 2011-2022 走看看