Подтвердить что ты не робот

Java: нет менеджера безопасности: загрузчик класса RMI отключен

Привет, у меня есть приложение RMI, и теперь я пытаюсь вызвать некоторые методы на сервере с моего клиента. У меня есть следующий код:

public static void main(final String[] args) {
    try {
        //Setting the security manager

        System.setSecurityManager(new RMISecurityManager());
        IndicatorsService server = (IndicatorsService) Naming
                .lookup("rmi://localhost/" + IndicatorsService.SERVICE_NAME);
        DataProvider provider = new OHLCProvider(server);
        server.registerOHLCProvider(provider);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (RemoteException e) {
        e.printStackTrace();
    } catch (NotBoundException e) {
        e.printStackTrace();
    }
}

сервер правильно загружен, но когда я пытаюсь позвонить server.registerOHLCProvider(provider);, я получаю следующие ошибки:

     java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:336)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
    at sk.fri.statistics.service.impl.IndicatorsServiceImpl_Stub.registerOHLCProvider(Unknown Source)
    at sk.fri.statistics.service.Client.main(Client.java:61)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:296)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:290)
    ... 9 more

Я добавил файл политики как аргумент VM, вот как это выглядит:

grant {
    permission java.security.AllPermission;
}

Он продолжает говорить что-то об отключенной загрузке классов, поэтому я думаю, что проблема где-то там... Спасибо!

4b9b3361

Ответ 1

Загрузка удаленного класса может быть сложной.

Исходный пост не содержит никакой информации о базе кода. Возможно, что конфигурация безопасности клиента верна, но у нее нет доступа к удаленному коду. Классы загружаются непосредственно из "базы кода" клиентом. Они не предоставляются клиенту службой через соединение RMI. Служба просто ссылается на внешний источник для классов.

Сервер должен указать системное свойство java.rmi.server.codebase. Значение должно быть URL-адресом, доступным для клиента, из которого могут быть загружены необходимые классы. Если это URL file:, файловая система должна быть доступна клиенту.

И наоборот: если сервер должен иметь возможность загружать классы из клиента (например, здесь), клиент должен установить для свойства базы кода URL, доступный для сервера.

Ответ 2

Каждый раз, когда вы вызываете метод динамического прокси-сервера RMI, MarshalInputStream (который расширяет ObjectInputStream для переопределения resolveClass и resolveProxyClass) делегирует LoaderHandler, чтобы посмотреть 3 места для ClassLoader:

Итак, есть несколько возможных причин, по которым вы получите ClassNotFoundException при вызове метода Remote:

  • Если в стеке не входит "диспетчер безопасности: загрузчик классов RMI отключен", тогда обязательно установите SecurityManager, как описано другими, если вам нужна удаленная загрузка классов для обеих сторон, чтобы получить все удаленные интерфейсы и сериализуемые классы.
  • Если вы используете загрузку удаленных классов и перестали работать при обновлении до JRE 7u21, либо установите -Djava.rmi.server.useCodebaseOnly=true в соответствии с предыдущим поведением, либо установите -Djava.rmi.server.codebase в список URL-адресов, разделенных пробелами, как на локальном, так и на удаленные стороны. И убедитесь, что компьютер может получить доступ к этим URL-адресам.
  • Если вы используете локальный пользовательский ClassLoader, чей родительский загрузчик классов определяет некоторые удаленные интерфейсы, тогда обязательно вызовите Thread.setContextClassLoader(ClassLoader), чтобы RMI использовал этот ClassLoader. (Это была моя проблема: у меня был SwingWorker, который был запланирован на рабочий поток, который был создан до того, как contextClassLoader был установлен в EventDispatchThread). Например, A и C принадлежат вашему пользовательскому ClassLoader, но B принадлежит родительскому ClassLoader, тогда при вызове a.getB(). GetC() вызов getB() будет использовать пользовательский загрузчик классов, но вызов getC() не сможет найти C в последнемUserDefinedClassLoader и должен будет вернуться к contextClassLoader.

Все это является предостерегающим рассказом о плохом дизайне API ObjectInputStream. ObjectInputStream должен потребовать, чтобы вы передавали параметр ClassLoader, а не пытались найти один случайный случай с использованием lastUserDefinedLoader, contextClassLoader и кодовой базы.

Ответ 3

Вам нужен менеджер безопасности на стороне сервера, а не только на стороне клиента.

Без этого механизм RMI сервера отказывается загружать классы с клиента, поскольку он не может гарантировать, что они не будут делать зла на сервере.

Вам нужна загрузка класса RMI вообще? Может ли сервер уже иметь классы, которые клиент пытается отправить?

Ответ 4

У меня похожая проблема. мой сервер сделан с весенней загрузкой, а мой клиент javafx - это мой удаленный интерфейс:

public interface TerritoireRemote extends Remote {
    public Region saveRegion(Region region) throws RemoteException;
    public Region getRegion(Integer idRegion) throws RemoteException;
    public List<Region> getAllRegions() throws RemoteException;
    public Region updateRegion(Region region) throws RemoteException;
    public void deleteRegion(Integer idRegion) throws RemoteException;
    public Departement saveDepartement(Departement dept, Region region) throws RemoteException;
    public Departement getDepartement(Integer idDept) throws RemoteException;
    public List<Departement> getAllDepartements() throws RemoteException;
    public List<Departement> getAllDepartements(Integer idRegion) throws RemoteException;
    public List<Departement> getAllDepartements(Region region) throws RemoteException;
    public Departement updateDepartement(Departement dept) throws RemoteException;
    public void deleteDepartement(Integer idDep) throws RemoteException;
    public Arrondissement saveArrond(Arrondissement arrondissement, Departement departement) throws RemoteException;
    public List<Arrondissement> getAllArronds(Departement Dept) throws RemoteException;
    public List<Arrondissement> getAllArronds() throws RemoteException;
    public Arrondissement getArrond(Integer idArrond) throws RemoteException;
    public Arrondissement updateArrond(Arrondissement arrondissement) throws RemoteException;
    public void deleteArrond(Integer idArrond) throws RemoteException;
}

класс обслуживания:

@Component
public class TerritoireRemoteService implements TerritoireRemote {

    @Autowired
    private TerritoireNatServ service;

    @Override
    public Region saveRegion(Region region) throws RemoteException {
        return service.saveRegion(region);
    }

    @Override
    public Region getRegion(Integer idRegion) throws RemoteException {
        return service.getRegion(idRegion);
    }

    @Override
    public List<Region> getAllRegions() throws RemoteException {
        return service.getAllRegions();
    }

    @Override
    public Region updateRegion(Region region) throws RemoteException {
        return service.updateRegion(region);
    }

    @Override
    public void deleteRegion(Integer idRegion) throws RemoteException {
        service.deleteRegion(idRegion);
    }

    @Override
    public Departement saveDepartement(Departement dept, Region region) throws RemoteException {
        return service.saveDepartement(dept,region);
    }

    @Override
    public Departement getDepartement(Integer idDept) throws RemoteException {
        return service.getDepartement(idDept);
    }

    @Override
    public List<Departement> getAllDepartements() throws RemoteException {
        return service.getAllDepartements();
    }

    @Override
    public List<Departement> getAllDepartements(Integer idRegion) throws RemoteException {
        return service.getAllDepartements(idRegion);
    }

    @Override
    public List<Departement> getAllDepartements(Region region) throws RemoteException {
        return service.getAllDepartements(region);
    }

    @Override
    public Departement updateDepartement(Departement dept) throws RemoteException {
        return service.updateDepartement(dept);
    }

    @Override
    public void deleteDepartement(Integer idDep) throws RemoteException {
        service.deleteDepartement(idDep);
    }

    @Override
    public Arrondissement saveArrond(Arrondissement arrondissement, Departement departement) throws RemoteException {
        return service.saveArrond(arrondissement,departement);
    }

    @Override
    public List<Arrondissement> getAllArronds(Departement Dept) throws RemoteException {
        return service.getAllArronds(Dept);
    }

    @Override
    public List<Arrondissement> getAllArronds() throws RemoteException {
        return service.getAllArronds();
    }

    @Override
    public Arrondissement getArrond(Integer idArrond) throws RemoteException {
        return service.getArrond(idArrond);
    }

    @Override
    public Arrondissement updateArrond(Arrondissement arrondissement) throws RemoteException {
        return service.updateArrond(arrondissement);
    }

    @Override
    public void deleteArrond(Integer idArrond) throws RemoteException {
        service.deleteArrond(idArrond);
    }
}

код экспорта услуги:

@Bean
@Autowired
public RmiServiceExporter getTerritoirService(TerritoireRemote territoireRemote ){
    RmiServiceExporter exporter = new RmiServiceExporter();
    exporter.setServiceName("territoire");
    exporter.setService(territoireRemote);
    exporter.setRegistryPort(port);
    return exporter;
}

код javafx:

public void initialize(URL url, ResourceBundle rb) {
        List<Region> regions = new ArrayList<>();
        try {
            TerritoireRemote stub = (TerritoireRemote) Naming.lookup("rmi://localhost:5400/territoire");
            regions = stub.getAllRegions();
        } catch (RemoteException | NotBoundException | MalformedURLException ex) {
            Logger.getLogger(AjouterController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

ошибка получена:

avr. 09, 2019 6:52:04 PM sgsp.admin.ui.home.structuremed.ajouter.AjouterController initialize
GRAVE: null
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: org.hibernate.collection.internal.PersistentBag (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
    at com.sun.proxy.$Proxy6.getAllRegions(Unknown Source)
    at sgsp.admin.ui.home.structuremed.ajouter.AjouterController.initialize(AjouterController.java:70)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at sgsp.Func.loadWindow(Func.java:80)
    at sgsp.admin.ui.home.MainController.addStruct(MainController.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.hibernate.collection.internal.PersistentBag (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:396)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:186)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:212)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1859)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1745)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2033)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2278)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2202)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    at java.util.ArrayList.readObject(ArrayList.java:797)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1158)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:322)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:174)
    ... 80 more

помощь будет приветствоваться, спасибо!

Ответ 5

Я знаю, почему это происходит. например, вы запускаете сервер в проекте A, но вы используете клиента в проекте B для запроса этого сервера, это неправильно. Поэтому вы должны поместить сервер и клиент в один и тот же проект.