第一个问题是为什么会发生这种session不同步的问题
我知道的session的流程是这样的
首先客户端会把自己本地cookies中带一个类似JSeesionId的字段给服务器要session对象
如果没有服务器就创建一个新的session并把Id给客户端的cookies,下次客户端再发起请求的时候就会要到这次创建的session
那么既然sessionId是存在客户端cookies里,每次都是客户端带给服务的,为什么在集群的环境中会发生session不一样的情况呢,我的理解是这样的
首先nginx帮我路由到不同的服务器,如果我第一次请求到A服务器,服务器发现我并没有带sessionId,那么帮我创建了一个session并回传给我一个sessionId。
我第二次请求到B服务器,带着上次A服务器给我的sessionId给B服务器,因为B服务器上并没有A给我的那个sessionId的session对象,B服务器又给我创建了一个新的session对象,然后给客户端cookies这样就产生了session不同步的情况,不知道我这样理解对不对?
解决方案的难点
我现在不知道有没有人有开源项目已经解决了jfinal中session共享的方案,如果有麻烦能提供一下地址,谢谢。
如果自己想实现一个redis的session共享的方案应该怎么做,我现在难点在于,
1.我不知道两次请求是否同一个用户,这个如何判断
2.session的生命周期怎么处理,一般都是tomcat服务器帮我做处理的
项目:JFinal
解决的思路极其简单:让每一个节点保持无状态,也就是每个节点根本就不存 session
落实到代码,你手头的 jfinal club 已经实现了,该项目是将 session 存放在数据库中的,而每个节点的 ehcache 仅仅只是对 session 进行缓存提速处理,当 ehcache 中找不到 session 时,会去数据库的 session 表读取 session 值
不必舍近求远,搞懂 jfinal club 中的 session 表以及相关业务就可以了