jfinal表单重复提交机制中的一些疑问

jfinal表单重复提交用token的机制来实现

我看TokenManager的createToken的代码生成完的token是存放在session中,以便之后来比较去前端界面传过来的token做校验

createToken

String tokenId = String.valueOf(random.nextLong());
controller.setAttr(tokenName, tokenId);
controller.setSessionAttr(tokenName, tokenId);
createTokenHiddenField(controller, tokenName, tokenId);

验证validToken

String serverTokenId = controller.getSessionAttr(tokenName);
controller.removeSessionAttr(tokenName);      // important!
return StrKit.notBlank(clientTokenId) && clientTokenId.equals(serverTokenId);

但是这样有个问题是,一旦我的服务器是集群的,是否session不是共享的?

两次客户端的请求如果第一次发送到A服务器把token存到A服务器的session中,第二次如果请求到B服务器,验证token发现B服务器中session并没有存放token这样的话就出问题了,我想问一下是否存在这样的情况。

如果存在是否我要做一个session共享的机制,现在session共享的机制的解决方案有哪些?

我的项目环境是jfinal + redis + mysql +tomcat

评论区

linuxea

2017-07-23 16:44

服务器集群还怎么共享一台服务器上的session.依我看是通过redis来实现这个方案

JFinal

2017-07-23 20:50

这种需求 jfinal 自然早就满足了,在 configConstant(Constants me) 中配置一个自己的 ITokenCache 即可:
me.setTokenCache(new MyTokenCache())

这个 MyTokenCache 可以利用一个集中式缓存,例如 redis 来实现

热门反馈

扫码入社