RMI:远程对象的字段是否已序列化并发送给客户端?

时间:2016-08-08 16:31:02

标签: java security rmi

我有以下代码:

public class Foo implements SomeRemote {
  private String verySecretString;
  public void doSomething(){...}
}

据我所知,foo将以某种方式被序列化并从RMI服务器发送到RMI客户端。那么,客户端是否可以访问verySecretString

2 个答案:

答案 0 :(得分:2)

这不是它的工作原理,你应该公开一个Remote接口而不是一个类,然后在客户端级别操作接口,这样客户端就不知道实现细节了。

所以在这里你应该有类似的东西:

public interface MyService extends Remote {
    void doSomething() throws RemoteException;
}

这只是您在客户端级别所知道的。在服务器级别,您将获得实现Foo,例如:

public class Foo implements MyService {
    private String verySecretString;
    public void doSomething(){...}
}

响应更新:

如果您不希望序列化字段值,只需将关键字transient添加到其声明中:

private transient String verySecretString;

答案 1 :(得分:1)

  

据我所知,foo将以某种方式被序列化并从RMI服务器发送到RMI客户端。

没有。如果Foo是导出的远程对象,则不会在任何地方发送。它的存根将被发送。

  

那么,客户端是否可以访问verySecretString?

没有