session共享个人小结
一.需求问题:
如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?
这个时候会话id在客户端是没有问题的,
但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,
于是session的共享就成了一个问题。
二.实现session共享方法:
1.通过保存sessionID来获取对应session的值,
php中,通过session_Id()函数能取到sessionID,session的值是保存在服务端的,我们可以将sessionID保存在cookie中,因为cookie是保存在客户端的。
当用户请求后端数据时,首先获取保存在客户端的cookie中的sessionID值,在php中首先
$sessionid =$_COOKIE['sesssionid'];
session_id($sessionid) //设置获取对应sessionid的session的值
session_start() //此函数一定要在session_id()函数的后面
之后就可以获取对应的session值
***此方法的sessionID保存在客户端,信息存储不安全,cookie也可以伪造
2。
利用nginx的基于访问ip的hash路由策略,
保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。
但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
而且客户端访问的服务器必须是这个nginx上,否咋ip获取不准确造成混乱。
3。
使用memcache和redis实现共享(个人首选)
修改所有服务器 php配置文件里面的
session.save_handler = files 改为session.save_handler = memcache /redis
session.save_path = "127.0.0.1:11211或127.0.0.1:6379"
或者使用in_set()方法
4.保存在数据库
数据库需要同步,增加了数据库的i/o,一般不使用