unLock方法为什么没执行

unLock方法为什么没执行

       最近我们打算实现在对象的编辑页面时,对对象进行加锁,也就是对象在被一个用户修改时,其他此时就不能再修改该对象了,这样可以保证同一个对象不被两个人同时修改,避免发生先提交的用户数据会被后提交的用户数据覆盖。

       实现方案是在页面加载时通过java代码判断是否被其他人锁定,如果被其他人锁定,则给出提示;如果没有锁定,则用户进入对象的编辑页面。当用户在关闭页面触发“window. onUnload”方法时,调用ajax请求去服务器端解锁对象。当然,我们也考虑到ajax请求可能失败,这样会造成对象永久锁定,为了解决这个问题,我们在对一个对象锁定时,最长的锁定时间不能超过20分钟,这样可以在一定程度上避免因为某种情况的出错而造成对象的永久锁定。

       这种实现方案在IE浏览器下,执行没有问题,但是在火狐、chrome等其他浏览器上,却会造成没有去通知服务器解锁对象。通过跟踪,发现问题是出现在函数“window. onUnload”的执行上。“window. onUnload”函数的代码如下:

function unlockObj(_nObjId, _nObjType){

              $.ajax({

                     type:"post",

                     url:"../include/object_unlock.jsp",

                     async:false,//设置同步请求,没有问题;异步请求,则会有问题

                     data:{ObjId:_nObjId,ObjType:_nObjType},

                     success:function(data){

                            return;

                     },

                     error:function(data){

                            return;

                     }

              });

              return;

       }


 

       无论在什么浏览器下,在关闭浏览器时“window. onUnload”函数都会执行。我们知道,浏览器在执行ajax时,ajax对象的返回状态值(readyState)会依次变为1->2->3->4,当ajax的状态值为4时,也就是ajax请求执行完成(complete)。对于“window. onUnload”函数,在IE浏览器下,无论ajax的返回状态值是几,被ajax请求的页面(也就是object_unlock.jsp)中的system.out输出语句都有值会输出。但是在火狐、chrome等其他浏览器下,通过httpwatch,可以看到ajax请求正常,但是ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句没有输出,后来经过我测试,只有ajax的请求的返回状态码是4ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句才能输出结果。

       至于具体为什么,没有搞明白。本文测试的发送ajax请求是使用jquery.js类库(1.4.4版本)组件发送的。

       解决的办法是在关闭浏览器时触发的“window. onUnload”函数中,发送的ajax请求设置为同步就可以了,也就是设置属性“async”为“false”,参见上面代码红色区域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O溺水的鱼0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值