【问题标题】:Java denying access to property permissionsJava 拒绝访问属性权限
【发布时间】:2017-02-15 22:56:45
【问题描述】:

并行/分布式计算新手,我尝试编写的客户端-服务器程序存在问题。应该发生的是服务器从客户端接收一个整数并将所有数字的总和发送回它(例如,用户输入 5,服务器计算 1+2+3+4+5,服务器发回 15)。我还在努力解决这个问题,所以我在客户端对输入进行了硬编码。

这是我在服务器端的:

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
import java.util.*;
public class Server {

public static void main(String[]args) {

    try{
        int port = 16790;
        String host = "localhost";
        CalculateSumServerImpl export = new CalculateSumServerImpl();
        LocateRegistry.createRegistry(port);
        String registryURL = "rmi://" + host + ":" + port + "/sum";
        Naming.rebind(registryURL, export);
        System.out.println("Server ready");
    } catch (Exception e) {
        e.printStackTrace();
    }
}   }


//to calculate the sum
import java.rmi.*;
import java.rmi.server.*;

public class CalculateSumServerImpl extends UnicastRemoteObject implements     CalServerInterface {

public int n; //value entered
public int sum; //sum

protected CalculateSumServerImpl() throws RemoteException {
    super();
}

@Override
public int calculateSum(int n) throws RemoteException {

    n = (n*(n+1))/2; //sum of 1 + 2 + 3 + .. + n

    sum = n;

    return sum;
} }

//interface
import java.rmi.Remote;

public interface CalServerInterface extends Remote {

 public int calculateSum(int n ) throws java.rmi.RemoteException;
}

在客户端:

import java.rmi.*;
import java.util.PropertyPermission;

public class Client {
public static void main(String[]args) {

    System.setSecurityManager(new java.rmi.RMISecurityManager());
    System.setProperty("java.net.preferIPv4Stack" , "true");

    try {
        int port = 16790;
        String host = "localhost";
        String registryURL = "rmi://" + host + ":" + port + "/sum";

        Project4ServerInterface obj = (Project4ServerInterface)Naming.lookup(registryURL);
        System.out.println("Lookup completed.");

        int output = obj.calculateSum(3);
        System.out.println("Sum is: " + output);

    } catch (Exception e) {
        e.printStackTrace();
    }

    System.setProperty("java.net.preferIPv4Stack","true");

} }

我也在客户端实现了接口。

我在客户端遇到的错误是:

线程“main”java.security.AccessControlException 中的异常:访问被拒绝(“java.util.PropertyPermission”“java.net.preferIPv4Stack”“write”) 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 在 java.security.AccessController.checkPermission(AccessController.java:884) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.lang.System.setProperty(System.java:792) 在 project04client.Client.main(Client.java:10)

错误指向带有此代码的行:

System.setProperty("java.net.preferIPv4Stack" , "true");

任何人有解决此错误的经验吗?

谢谢!

【问题讨论】:

    标签: java parallel-processing client-server rmi distributed-computing


    【解决方案1】:

    问题是您为整个(客户端)应用程序设置了一个安全管理器,不允许您修改系统属性。

    简单的解决方法是在设置 RMI 安全管理器之前设置需要设置的系统属性。

    或者,您可以完全摆脱System.setSecurityManager(...) 调用。您(可能)仅在您希望客户端能够从您的 RMI 服务下载类时才需要它。


    我尝试在安全管理器之前设置系统属性并获得AccessControlException,拒绝套接字权限。

    这没有多大意义。如果当时有安全管理员,您只会得到AccessControlException。不应该......除非这是在网络浏览器中启动的小程序代码或类似代码。另外,我不知道为什么调用设置属性会被拒绝说你没有套接字权限。

    当我完全取出安全管理器时,我得到了一个指向接口的 UnmarshalException。

    您还需要为您将解组到客户端类路径的对象添加类/接口。


    实际上,我只是注意到javadocRMISecurityManager 说:

    "RMISecurityManager 实现的策略与SecurityManager 实现的策略相同。RMI 应用程序应使用SecurityManager 类或其他适当的SecurityManager 实现而不是此类。"

    【讨论】:

    • 感谢您的超级快速响应。我尝试在安全管理器之前设置系统属性并得到一个 AccessControlException,拒绝套接字权限。当我完全取出安全管理器时,我得到了一个指向接口的 UnmarshalException。但是我不能向接口添加安全管理器,可以吗?添加它不会编译。
    • 这意味着您没有将接口类部署到 RMI Registry CLASSPATH 或客户端,具体取决于您何时收到异常。
    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2016-09-02
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多