nginx+tomcat+redis解决sessiong共享的问题疑问

第一个问题是为什么会发生这种session不同步的问题

我知道的session的流程是这样的

  1. 首先客户端会把自己本地cookies中带一个类似JSeesionId的字段给服务器要session对象

  2. 如果没有服务器就创建一个新的session并把Id给客户端的cookies,下次客户端再发起请求的时候就会要到这次创建的session

那么既然sessionId是存在客户端cookies里,每次都是客户端带给服务的,为什么在集群的环境中会发生session不一样的情况呢,我的理解是这样的

首先nginx帮我路由到不同的服务器,如果我第一次请求到A服务器,服务器发现我并没有带sessionId,那么帮我创建了一个session并回传给我一个sessionId。

我第二次请求到B服务器,带着上次A服务器给我的sessionId给B服务器,因为B服务器上并没有A给我的那个sessionId的session对象,B服务器又给我创建了一个新的session对象,然后给客户端cookies这样就产生了session不同步的情况,不知道我这样理解对不对?

解决方案的难点

  1. 我现在不知道有没有人有开源项目已经解决了jfinal中session共享的方案,如果有麻烦能提供一下地址,谢谢。

  2. 如果自己想实现一个redis的session共享的方案应该怎么做,我现在难点在于,

     1.我不知道两次请求是否同一个用户,这个如何判断

     2.session的生命周期怎么处理,一般都是tomcat服务器帮我做处理的

评论区

JFinal

2017-08-09 15:10

在集群方式下,请求到达集群某节点是动态的,如果不同的节点都存放了 session,那么在第二次请求到达另一个节点时仍然找不到 session

解决的思路极其简单:让每一个节点保持无状态,也就是每个节点根本就不存 session

落实到代码,你手头的 jfinal club 已经实现了,该项目是将 session 存放在数据库中的,而每个节点的 ehcache 仅仅只是对 session 进行缓存提速处理,当 ehcache 中找不到 session 时,会去数据库的 session 表读取 session 值

不必舍近求远,搞懂 jfinal club 中的 session 表以及相关业务就可以了

phphappy

2017-12-19 18:40

有没有现成的redis共享的方案?

热门反馈

扫码入社