cookie需要刷新才生效吗?
最近一投票项目中需要做身份验证,用户需要填写有效身份证号和手机号才能完成投票。
这两条信息都是唯一的,且验证后就不能更改。
用户登陆后,这些信息会存在于同一个cookie中(当然都是加密过的)。
页面加载后js中有两个变量分别记录身份证和手机号是否已通过验证,
用户点击投票提交按钮时,js判断两个信息是否都已验证,若都未验证则(弹出层)要求用户同时填写身份证和手机号,若其中一条未验证则要求输入该条信息,否则直接提交投票。
这两条信息填写完都以ajax方式提交到后台,避免浏览器刷新带来的不良体验(如选好的投票信息丢失,用户需重投)。
后台有两个api分别响应身份证和手机号的提交,验证成功则写入数据库同时修改现有cookie信息,并返回该条记录的验证结果给前台,如果结果是“真”则前台赋值对应变量为“真”,同时判断另一变量是否亦为“真”,两条都为“真”时则提交投票。
提交单条信息的情况比较简单,若两条都未通过验证则同时发起两个ajax请求。
貌似这样应该不会出问题了,而且也确实能正常提交投票了。
但是,问题来了:
投票完,返回要继续投票时,还是提示其中一条信息(一般是前一条)未验证,而且再次填写并提交时通不过验证,因为数据库已经存在该记录且不允许修改。
为什么呢?
原来两次ajax提交过程中,第一次提交(服务端更新数据库并向浏览器输出cookie)但浏览器还没有来得及收到返回结果(cookie还没更新),第二次提交请求又过来了,这时服务端更新完数据库,但因为从cookie读不到上一条提交的信息会认为上一条未验证,并向浏览器错误的输出cookie。这样两次虽然都能返回验证成功的结果,但两次的cookie会相互覆盖,先返回给浏览器的cookie会丢失。
怎么办呢?
其实只要在收到第一次请求的返回结果后再发送第二次请求就ok了。
结论:
以前总认为cookie写完后需要刷新浏览器才生效,虽然事实上好像如此,但从cookie的机制来讲,这种说法是不准确的。其实写cookie本身就是浏览器的事,服务端只是输出一个响应罢了