使用GWT RPC时的安全性

use*_*478 5 java security gwt servlets javabeans

我在Google Web Toolkit中有一个POJO,我可以从服务器中检索.

class Person implements Serializable {
  String name;
  Date creationDate;
}
Run Code Online (Sandbox Code Playgroud)

当客户端进行更改时,我使用GWT RemoteServiceServlet将其保存回服务器,如下所示:

rpcService.saveObject(myPerson,...)
Run Code Online (Sandbox Code Playgroud)

问题是用户不应该改变creationDate.由于RPC方法实际上只是服务器的HTTP POST,因此可以creationDate通过更改POST请求来修改它.

一个简单的解决方案是创建一系列RPC函数,例如changeName(String newName),等等,但是具有许多字段的类将需要针对每个字段的许多方法,并且一次更改多个字段将是低效的.

我喜欢在服务器和GWT客户端上使用单个POJO的简单性,但需要一种安全的方法.有任何想法吗?

编辑

我正在重新提交赏金,试图看看是否还有其他想法.也许我原来的问题过于关注GWT的具体细节.我认为这是任何使用JavaBeans在安全(servlet容器)和不安全(web浏览器)环境之间传递数据的系统的一般性问题.

编辑2

另外,为了清楚起见,我使用该字段creationDate作为问题的一个例子.实际上,我正在使用的代码更复杂,有许多不同的领域.

jwe*_*ich 3

我建议您保留单一 RPC 方法,并使用 POJO/bean 映射器,例如DozerGilead

  • 使用 Dozer,您可以创建一个类映射,用于将属性从一个对象复制到另一个对象。如果您未在类映射中指定属性,则不会复制该属性。
  • 对于 Gilead,@ReadOnly传输注释应该足够了。

附带的好处是您不需要更改数据访问层(假设您有一个)。是否使用 ORM、是否使用关系数据库都没有关系。