用户的登陆请求被转发到tomcat1上;
假设是第一次调用getSession方法(使用true作为参数)得到session。这时session会被创建;
在创建了Session的同时,服务器会为该Session生成唯一的Session id;
程序得到session后,session.addAttribute(“user”, user);
然后将sesessionId返回给浏览器。
上述这种情况就是有状态的请求。
如果用户再次向服务器发送请求,假设被nginx转发到tomcat2服务器上,tomcat2上没有session,系统就会要求用户再次登陆。这显然是不合理的。
上述的情况就是session共享的问题。
解决方法:
1. session同步
tomcat支持动态将某个tomcat下的session复制到其他的tomcat中,但是这个方式是早期的企业级应用习惯的方式。现在很少使用。
这种方式在集群数量很少的时候,结果还是可以的。但是如果集群数量庞大,都需要复制session, 这时会因为网络延迟,或者session内容非常大。
就会有隐患,数据可能会存在不一致问题。
2. session黏着
对IP或者URL进行hash, 这种会导致资源分配不均匀的情况。
因为uri比ip地址相应数量多,变化就多,因此uri-hash比ip-hash分布更均衡些。
uri-hash需要第三方软件支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz
3. 将信息放到cookie
缺点:客户可能会禁用cookie可以被禁用;
cookie要随着浏览器传递,增大了传输的内容,
cookie大小有限制。
Firefox、Safari:4097byte,(key=value);Opera: 4096byte,(key=value)
Internet Explorer: 4096个byte,(key=value)
多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。
4. 将session从系统中独立出来
目前主流做法是利用redis作为session管理的实现,因为redis访问极其快速。