2017-09-29 09:43:14 2904次浏览 2条回答 0 悬赏 10 金钱

线上系统采用yii2-redis里的session来管理Session,因为源码未提供加锁的处理导致页面里多个ajax请求时,出现后面的ajax把前一个ajax里写入session的值覆盖掉了,而apache的文件存储session因为对文件加锁,所以不会出现这类问题,由此想问问大家在用redis的时候有没有必要加个锁(我遇到的问题可以通过改变ajax请求的顺序解决掉)。

遇到的场景:
1.加载页面完成,此时验证码是:1234
2.发送ajax请求局部页面,此页面里包含了新生成的图形验证码,例如此时验证码是:abcd。
3.发送ajax请求请求另一个数据,此数据是全局通用的,此时验证码被覆盖还原回1234。
4.第2步生成的局部页面中的图形验证码image标签请求图形验证码图片,获得的是1234。

解决办法思路:
1.改变ajax请求的顺序。
2.改变图形验证码的存储方式,与session分离,不放在session里。
3.对session加锁,避免session被覆盖重写。

问题:
1.有没有必要对session加锁

  • 回答于 2017-09-30 07:46 举报

    使用场景是不是设计有点问题,同一个页面中不应该提供两个验证码吧,如果需要同时存在是否应该用不同的session名进行区分

    1 条回复
    回复于 2017-09-30 09:41 回复

    只有一个验证码,只不过验证码是放在session里的,两个ajax去请求,第一个更新了验证码,第二个拿到的还是原来的那个,都写入session的时候,第二个就把新生成的覆盖掉了

  • 回答于 2017-09-30 11:40 举报

    用个乐观锁就可以啦

    1 条回复
    回复于 2017-09-30 11:56 回复

    负载均衡下多台服务器下怎么实现乐观锁?

您需要登录后才可以回答。登录 | 立即注册
niqingyang
助理

niqingyang 河北省秦皇岛市

注册时间:2017-04-09
最后登录:2020-11-11
在线时长:4小时3分
  • 粉丝2
  • 金钱105
  • 威望0
  • 积分145

热门问题