Olá pessoal. Estou implementando um servlet que deve conectar a um serviço RMI. Estou tendo problemas de controle de acesso entre o servlet (cliente) e o servidor RMI:
java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:269)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
at java.lang.Thread.setContextClassLoader(Thread.java:1212)
Sei que este problema deve-se a falta do java.policy. O problema está justamente aí. Compactei o .war com todo o serviço (inclusive o java.policy com permissão para conexão). No tutorial de RMI do site da SUN, a referência ao arquivo java.policy é feito em linha de comando passando-se como uma propriedade, assim:
-Djava.security.policy=java.policy
Como faço para que o Tomcat use o java.policy que tenho para este contexto (onde o servlet acessa RMI) especificamente? Grato T+
Como tu referenciou a este RMI, poste o código.
:okok:
Olá, a chamada é feita a este método:
public StringBuffer getResponse(SVCInitElement svcInitElement)
throws MalformedURLException, RemoteException, NotBoundException {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
GMLCPositionRequest gmlc = buildGMLCPositionRequest(svcInitElement);
EOTD eotd = (EOTD) Naming.lookup(EOTD.SERVICE_NAME);
return eotd.locale(gmlc);
}
Esta implementação está muito parecida com o exemplo da Sun. Quando rodei um cliente de teste o programa funcionou. Mas aí executei a linha de comando fornecendo a ele como parâmetro a referência ao arquivo java.policy que ele deveria utilizar. Meu problema é fazer o Tomcat associar isto ao contexto do meu servlet. Outro detalhe é que o Tomcat roda como serviço do Windows, não sei se isto ajuda. Valeu T+
Se alguém souver de alguma referência de como fazer um servlet invocar métodos RMI eu agraderia muito
mas vai ser da mesma maneira como qualquer outra aplicação java invocaria :roll:
Entendo… o problema em si não é a invocação e sim associar um arquivo java.police ao contexto da aplicação ou ao Tomcat. Pois sem isso ele não comunica e gera erro de segurança.