如何实现session共享

session被用于表示一个持续的链接状态,在网站访问中通常指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
session的常见实现形式是会话cookie(session cookie),即未设置过时时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,若是未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,若是存在则直接使用该sessionid,若不存在则从新生成新的 session。这里须要注意的是session始终是有服务端建立的,并不是浏览器本身生成的。 可是浏览器的cookie被禁止后session就须要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。php

如何实现session的共享?
首先咱们应该明白,为何要实现共享,若是你的网站是存放在一个机器上,那么是不存在这个问题的,由于会话数据就在这台机器,可是若是你使用了负载均衡把请求分发到不一样的机器呢?这个时候会话id在客户端是没有问题的,可是若是用户的两次请求到了两台不一样的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的状况,因而session的共享就成了一个问题。

1.各类web框架早已考虑到这个问题,好比asp.net,是支持经过配置文件修改session的存储介质为sql server的,全部机器的会话数据都从同一个数据库读,就不会存在不一致的问题;

2.以cookie加密的方式保存在客户端.优势是减轻服务器端的压力,缺点是受到cookie的大小限制,可能占用必定带宽,由于每次请求会在头部附带必定大小的cookie信息,另外这种方式在用户禁止使用cookie的状况下无效.

3.服务器间同步。定时同步各个服务器的session信息,此方法可能有必定延时,用户体验也不是很好。

4.php支持把会话数据存储到某台memcache服务器,你也能够手工把session文件存放的目录改成nfs网络文件系统,从而实现文件的跨机器共享。
还有一个简单的办法能够用于会话信息不会频繁变动的状况,在机器a设置用户会话的时候,把会话数据post到机器b的一个cgi,机器b的cgi把会话数据存下来,这样机器a和b都会有同一份session数据的拷贝。web

---------------------------------------------------------------------------------------------------------------------sql

1. 客户端cookie加密数据库

2. application server的session复制浏览器

3. 使用数据库保存session服务器

4. 使用共享存储来保存sessioncookie

5. 使用memcached来保存session网络

6. 使用terracotta来保存sessionsession

相关文章
相关标签/搜索