我有一个使用Java、Hibernate和im的Rest后端,使用version属性进行乐观锁定。对于并发控制,此版本属性必须转到客户端,然后再转到带有post请求的服务器。但是,在javascript客户机中,我失去了对该属性完整性的控制,例如:
记住,这是一个Rest后端,因此我无法在服务器中保存传递给每个用户的对象的版本号,等等。
因此,如果这是一个我认为是有效的问题,我如何确保该版本在客户端保持不变?
发布于 2015-04-30 17:31:20
就我个人而言,我会重新考虑这样做,因为我认为客户端这样做的动机很少,而且根据定义,您无法控制客户端发送给REST服务的内容。
但是,如果您确实有一个业务案例,那么一个半解决方案就是将version属性设置为GUID。这样,只有当您拥有最新的GUID (客户端B不具备这种GUID)时,才能提交,这使得版本控制的情况更加复杂,因为在请求成功之前,不能只增加1。
但是,即使在那里,您也不是完全安全的,因为客户机B理论上可以执行单独的请求,从资源中获取更新的GUID,然后使用更新的GUID重新提交失败的请求。
但是,既然客户B可以对更新版本进行编辑,以恢复客户端A所做的内容并添加它们自己的内容,这在本质上就是这样做的,而且由于他们有权这样做,我们又回到了自己的问题上,为什么我们要再次担心这种情况。
发布于 2015-04-30 17:23:59
使用一个构造函数来隐藏只读getter后面的数字:
var MyObject = function(version) {
var _version = version;
this.getVersion = function() { return _version; }
}或者,使用允许只设置一次变量的getter和setter对:
var MyObject = function() {
var self = this;
var _tripwire = false;
var _value = null;
self.setValue = function(val) {
if (_tripwire==false)
_tripwire = true;
else
throw "Value is read-only";
_value = val;
};
self.getValue = function() {
return val;
}
};JSFiddle
取决于您希望它失败的方式,您可以用一个返回来替换抛出语句,该返回默默地吃掉属性集,但是对于API代码,当调用者做了一些非常不安全的事情时,最好大声而自豪地死去。
请注意,如果您更喜欢属性样式的访问方法,也可以使用属性访问器完成相同的设计模式:
function setOnceProp(o, name) {
var _value = null;
var _tripwire = false;
Object.defineProperty(o, name, {
get: function() {
return _value;
},
set: function(newValue) {
if (_tripwire==false)
_tripwire = true;
else
throw "Value is read-only";
_value = newValue;
},
enumerable: true
});
}
var MyObject = function() {
var self = this;
setOnceProp(self, 'value');
};这确实要求您的客户端使用相对较新的浏览器。
https://stackoverflow.com/questions/29973919
复制相似问题