如果实现session
发布于 6天前 作者 wtcsy 254 次浏览 来自 问答

不通过框架 实现session 有相关的资料吗? 想学习下…

10 回复

expressjs/session 自己去实现一个sessionstore

这是一段基于cookie实现session的简单代码,还有很多地方不完善,可以参考express的实现

var sessions = {};
var session_key = 'freemind_session';
var EXPIRES = 20 * 60 * 1000;

//生成session的代码
var generate = function(){
    var session = {};
    session.id = (new Date()).getTime() + Math.random();
    session.cookie = {
        expires: (new Date()).getTime() + EXPIRES
    };
    sessions[session.id] = session;
    return session;
};

//请求到来时检查cookie的口令和服务端数据,如果过期,就重新生成,这部分只管服务端
exports.session =  function(req, res, next){
    var id = req.cookies[session_key];
    if(!id){
        req.session = generate();
    }
    else{
        var session = sessions[id];
        if(session){
            if(session.cookie.expires > (new Date()).getTime()){
                //更新超时时间
                session.cookie.expires = (new Date()).getTime() + EXPIRES;
                req.session = session;
            }
            else{
                //超时了,删除旧的数据,并重新生成
                delete sessions[id];
                req.session = generate();
            }
        }
        else{
            //如果session过期或者口令不对,重新生成session
            req.session = generate();
        }
    }
    var session = serialize(session_key, req.session.id, {path : '/'});
    res.setHeader('Set-Cookie', session);
    
    next();
};

function serialize(name, val, opt){
    var pairs = [name + '=' + val];
    opt = opt || {};
    if(opt.maxAge) pairs.push('Max-Age=' + opt.maxAge);
    if(opt.domain) pairs.push('Domain=' + opt.domain);
    if(opt.path) pairs.push('Path=' + opt.path);
    if(opt.expires) pairs.push('Expires=' + opt.expires.toUTCString());
    if(opt.httpOnly) pairs.push('HttpOnly');
    if(opt.secure) pairs.push('Secure');

    return pairs.join(';');
}

你可以考虑下我的这个实现 我的实现

其实我的想法和你的初衷有点类似,因为我用Node做后端接口,前段界面有前段工程师做。完全独立的。所以当初采用express自带的session存在一个问题,就是每一次request都是新的sessionid,而且还存在跨域问题(服务端api.xx.com,前端为www.xx.com)。因此我的做法就是:在登陆的时候,讲sessionid作为登陆接口的json输出数据,这样前端拿到了sessionid后,存在本地localstorage中,然后每次请求的时候把sessoinid传上来。 user_serv ice.js 你可以参考下。

来凑热闹, 不通过框架实现redis-session,至少现在公司用的还不错。

http://kirochen.com/2015/07/09/about-cookie-session/ http://kirochen.com/2015/07/28/client-session/ 最近写的博客,你可以看看,希望对你有用,不对的地方也可以指出

1.新用户请求 2.分配session id、 3.set cookie session id 4.用户再次请求,带cookie(含session id) 5.以session id 为key,在session中找到对应的value


想像成表结构,实现curd+更新机制 感觉session的更新机制重要点 express-session代码,不多

其实理解到session的本质后就容易实现了。sessionId是一个由服务器生成的uniqueId,通过返回结果时的Set-Cookie来告诉浏览器你下次会话把这个传给我,然后浏览器下次请求时就会带上Cookie这个header来告诉服务器我就是那谁谁谁

恩,看二楼的实现就行了,很容易理解,和九浅一深nodejs里的一样

多谢各位的耐心解答!~

@wp3xpp 忽然间又恍悟到一招…

回到顶部