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的请求的返回状态码是4时ajax请求的页面(也就是object_unlock.jsp)中的sytem.out输出语句才能输出结果。
至于具体为什么,没有搞明白。本文测试的发送ajax请求是使用jquery.js类库(1.4.4版本)组件发送的。
解决的办法是在关闭浏览器时触发的“window. onUnload”函数中,发送的ajax请求设置为同步就可以了,也就是设置属性“async”为“false”,参见上面代码红色区域。