Java拒绝访问属性权限
刚接触并行/分布式计算,并且在编写客户机-服务器程序时遇到问题。服务器从客户端接收到一个整数,并发回该整数之前的所有数字的总和(例如,用户输入5,服务器计算1+2+3+4+5,服务器发回15)。我仍在努力解决这个问题,所以我已经在客户端对输入进行了硬编码 这是我在服务器端的配置:Java拒绝访问属性权限,java,parallel-processing,client-server,rmi,distributed-computing,Java,Parallel Processing,Client Server,Rmi,Distributed Computing,刚接触并行/分布式计算,并且在编写客户机-服务器程序时遇到问题。服务器从客户端接收到一个整数,并发回该整数之前的所有数字的总和(例如,用户输入5,服务器计算1+2+3+4+5,服务器发回15)。我仍在努力解决这个问题,所以我已经在客户端对输入进行了硬编码 这是我在服务器端的配置: import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.net.*; import java.util.
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");
有人有解决此错误的经验吗
谢谢 问题在于您为整个(客户端)应用程序设置了安全管理器,不允许您修改系统属性 简单的修复方法是在设置RMI安全管理器之前设置需要设置的系统属性 或者,您可以完全摆脱
System.setSecurityManager(…)
调用。您(可能)只在希望客户端能够从RMI服务下载类时才需要它
我尝试在安全管理器之前设置系统属性,并获得了一个
AccessControlException
,拒绝套接字权限
那没有多大意义。只有在安全管理器到位的情况下,您才会得到一个AccessControlException
。不应该有。。。除非这是在web浏览器中启动的小程序代码或类似代码。另外,我不知道为什么设置属性的调用会被拒绝,说您没有套接字权限
当我将安全管理器完全取出时,我得到一个指向接口的解组异常
您还需要为要解组到客户端类路径的对象添加类/接口
事实上,我刚刚注意到for
RMISecurityManager
上说:
“RMISecurityManager
实现的策略与SecurityManager
实现的策略相同RMI应用程序应使用SecurityManager
类或其他适当的SecurityManager
实现,而不是此类。”
谢谢你的快速回复。我尝试在安全管理器之前设置系统属性,并获得AccessControlException,拒绝套接字权限。当我将安全管理器完全取出时,我得到一个指向接口的解组异常。但是我不能向接口添加安全管理器,对吗?添加它将无法编译。这意味着您没有将接口类部署到RMI注册表类路径或客户端的,具体取决于您获得异常的确切时间。