http协议是一种无状态的协议,服务器本身并不能区分出每个会话来。不过各种网页编程语言想asp.net php java等都是实现了自己的一套session管理机制的。我搜索了一下网上资料,总结一下看到的原理说明,大概有以下几点:
1. 服务器需要在 客户端与服务器间不停的传递session id的。会话状态的维护就是要靠增加这个来做到的吧,把http没有的功能扩展了一下。 传递保存的办法有 cookie 或者get 方法参数,隐藏form的属性,http协议的头部 等各种各样的办法。具体可以参考网上文档。
2. Session id的生成。
服务器需要一个很好的办法来区分不同的客户端的会话,所以也要为每个客户端生成一个不同session id了,避免别人伪造等。 根据网上文档 php实现大概的生成方法是:
hash_func = md5 / sha1 #可由php.ini配置
PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)
3. session在服务器端的保存功能。
各个语言平台里面都允许为session保存大量的数据的吧。保存的位置或者说办法也有很多
(1) 保存平台实现的内置管理器
(2) 保存于数据库 。 这个就可以在不同的机器上共享了。
(3) 扩展实现,保存于memcached等高性能服务里。 比如某牛人为tomcat实现的memcached session保存机制 “Use MemCacheStore in Tomcat” http://research-and-destroy.de/blog/2008/10/10/use-memcachestore-in-tomcat-for-storing-session-in-memcached-server/
这种应该性能就非常好了,而且session可以在集群系统不同机器上面共享访问了。
4. session id 应该是可以被监听到,然后伪造攻击的。 网上截获你的session id,然后就可以以你的身份访问网站了,很危险啊! 还是用https好点啊,如果安全要求比较高的话。