美文网首页
[Node] session

[Node] session

作者: 小黄人get徐先生 | 来源:发表于2019-12-08 13:52 被阅读0次

什么是 session?

session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

为什么使用 session 替换 cookie?

因为 cookie 比较危险,容易暴露用户的隐私信息;而 session 是存储在 server 端的,所以不存在这个问题。

cookie 只存储 userId,具体的用户信息存储在 session 里。


例子:使用 session 实现登录

const http = require('http');
const querystring = require('querystring');

const PORT = 8000;

// session 存储
const SESSION_DATA = {};

const server = http.createServer(async (req, res) => {

    const url = req.url; // /api/user/login?id=1
    req.path = url.split('?')[0]; // /api/user/login
    req.query = querystring.parse(url.split('?')[1]); // id=1 => { id: 1 }
    const method = req.method; // 请求方法

    // 解析 cookie
    req.cookie = {};
    req.headers.cookie && req.headers.cookie.split(';').forEach(item => {
        if (!item) {
            return
        }
        const [name, value] = item.trim().split('=');
        req.cookie[name] = value;
    });

    const userId = req.cookie.userId;

    if (method === 'GET' && req.path === '/api/user/login') {
        const { username, password } = req.query;
        if (username === 'bradxu' && password === '123') {
            // userId 应该是登录成功后查询数据库返回的值,这里我们生成一个固定值
            const userId = "1234";
            if (!SESSION_DATA[userId]) {
                SESSION_DATA[userId] = {
                    username
                };
            } else {
                SESSION_DATA[userId].username = username;
            }
            res.setHeader('Set-Cookie', `userId=${userId}; path=/; httpOnly`);
            res.end('Login success');
        }
        res.end('Login failed');
    }

    if (method === 'GET' && req.path === '/api/user/login-check') {
        if (userId && SESSION_DATA[userId] && SESSION_DATA[userId].username) {
            res.end('User logged in');
        }
        res.end('Not logged in, please log in first');
    }


});

server.listen(PORT, () => {
    console.log('listening on port 8000!');
});


问题:

上面的例子我们直接使用内存变量来存储 session,这样会有些问题。

  1. 进程内存有限,如果访问量过大,SESSION_DATA 变量就会变大,容易造成内存溢出
  2. 正式上线运行是多线程,进程之间的内存无法共享

所以我们考虑使用 redis 内存数据库来作为 session 的存储。具体使用方法见:npm redis

相关文章

  • nodejs 如何获取express-session的所有ses

    express-session express-session是在node服务端建立会话(session)的中间件...

  • [Node] session

    什么是 session? session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、...

  • Node.js防范csrf攻击

    csurf Node.js 防范csrf攻击中间件 需要session中间件(如:express-session)...

  • Node.JS 要点

    登录前 登录后 node session App schema User Schema Org Schema

  • 2018-12-19

    axios+node请求解决session的问题 当前后端分离利用axios请求后端存储的session时,会在页...

  • node使用JsonWebToken 生成token,完成用户登

    最近在用node做后台的登录,检测登录功能。在本地使用session可以成功,但是放服务器后发现session失效...

  • forever 让nodejs程序daemon模式运行

    正常情况下node server.js 启动后,如果关闭cmd或者是session 会话,同时也会关闭 node...

  • node-cookie-session

    cookie cookie概念和特点 在我们关闭一个登录过的网址并重新打开它后,我们的登录信息依然没有丢失;当我们...

  • node简易登录-session

    index.html index.js 优化,session可做持久化!

  • node.js session

    session 是另一种记录客户状态的机制,与 cookie 保存在浏览器端不同,session 保存在服务器当中...

网友评论

      本文标题:[Node] session

      本文链接:https://www.haomeiwen.com/subject/hirmgctx.html