愿奴胁下生双翼——— 详解cookie和session

  cookie和session都是基于web服务器的,不同的是cookie存储在客户端而session存储在服务器。

       当用户浏览网站时,web服务器会在浏览器上存储一些当前用户的相关信息,在本地Web客户端存储的就是cookie数据。服务器会根据cookie给浏览器特殊的数据返回。

       总之, cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务端保存状态的方案。cookie的内容主要包括:名字,值,过期时间, 路径, 域。路径和域一起构成Cookie的作用范围。若不设置过期时间,

  浏览器关闭之后便会消失这种cookie为会话 cookie。会话cookie不存在硬盘上,直接存在内存里,设置过期时间cookie才会存在硬盘上。

  seesion机制是一种服务期端的机制,服务器使用一种散列表的结构来保存信息。当程序需要为某个客户端请求创建一个session时,服务器首先检查客户端的请求里是否包含了一个session的标识,已经有了就查询,没有就创建。

  标识会在响应中返回到客户端保存在cookie里。

  node,js本身没有提供session模块,我们可以根据session的功能实现session。

var start = function (res, req) {
    var conn = {res: res, req: req};
    var cookies = {};

    if (typeof conn.req.headers.cookie != 'undefined') {
        conn.req.headers.cookie.split(';').forEach((cookie) => {
            "use strict";
            let parts = cookie.split('=');
            cookies[parts[0].trim()] = (parts[1] || '').trim();
        })
    } else {
        cookies.SESSID = 0;
    }
    var SESSID = cookies.SESSID;
    if (typeof sessions[SESSID] != 'undefined') { // 存在
        session = sessions[SESSID];
        if (session.expires < Date()) {
            delete sessions[SESSID];
            return newSession(conn.res)
        } else {
            var dt = new Date();
            dt.setMinutes(dt.getMinutes() + 30);
            session.expires = dt;
            return sessions[SESSID];
        }
    } else {
        return newSession(conn.res);
    }
}
function newSession(res) {
    var chars = '0123456789ABCDEFGHJKLHKJLYIUVUIqwertyuioplkjhsbsinkcnbj';
    var SESSID = '';
    for (var i = 0;i<40;i++) {
        var num = Math.floor(Math.random() * chars.length);
        SESSID += chars.substring(num, num+1)
    }

    if (typeof sessions[SESSID] !== 'undefined') {
        return newSession(res);
    }

    var dt = new Date();
    dt.setMinutes(dt.getMinutes() + 30);
    var session = {
        SESSID: SESSID,
        expires: dt
    }

    sessions[SESSID] = session;
    res.setHeader('Set-Cookie', 'SESSID=' + SESSID);
    return session;
}

function cleanSessions() {
    for (sess in sessions) {
        if (sess.expires < Date()) {
            delete sessions[sess.SESSID]
        }
    }
}

  以上是实现简单的session管理的代码,实现之后我们现在开始探究需要session机制的原因:

  上面的代码中我们创建了sessionid分别存储在服务端和浏览器的cookie里,当浏览器发出请求时,会将sessionid发送到服务端,服务端可以根据sessionid来获取到一段时间内用户的操作状态,sessionid存在过期时间。

  假设没有session机制存在,而http协议是无状态的,也就是没有一个特定的标识来标识是哪个浏览器发出的请求,这样的话,无法分辨用户。这便是session产生的原因。session可以存在文件, 数据库,内存中。

  也是就是说session是一种为了解决问题而存在的概念,cookie是实际存在的东西。session的所有操作都在服务端。

 

posted @ 2018-04-09 18:17  木子青牛  阅读(386)  评论(0编辑  收藏  举报