如果实现session
发布于 9 年前 作者 wtcsy 6126 次浏览 最后一次编辑是 8 年前 来自 问答

不通过框架 实现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 忽然间又恍悟到一招…

回到顶部