我已经在我的 JBoss (4.2.2.GA) 服务器和我们的 J2SE 客户端之间建立了 JMS 连接。客户端通过 Java Web Start 运行,在 JNLP 中,我有以下内容:
<jnlp version="1.5+" codebase="$$codebase" href="start.jnlp">
<!-- Information -->
<security>
<all-permissions />
</security>
<resources>
<!-- Some other non-JMS resources -->
<jar href="concurrent.jar" />
<jar href="jboss-common.jar" />
<jar href="jboss-j2ee.jar" />
<jar href="jbossmq.jar" />
<jar href="jnpserver.jar" />
<jar href="log4j.jar" />
<resources>
</jnlp>
JMS 连接工作正常。我已经成功配置、订阅和测试了一个 JMS 主题。这是该代码:
final String topic = ... ;
final InitialContext context = new InitialContext();
PrivilegedAction<JmsConnectionContext> action = new PrivilegedAction<JmsConnectionContext>() {
@Override
public JmsConnectionContext run() {
try {
TopicConnectionFactory connectionFactory = (TopicConnectionFactory) context.lookup("TopicConnectionFactory");
TopicConnection topicConnection = connectionFactory.createTopicConnection();
int sessionId = Client.getSession().getSessionId();
topicConnection.setClientID("UMClient-" + sessionId);
TopicSession session = topicConnection.createTopicSession(false,
TopicSession.AUTO_ACKNOWLEDGE);
Topic jmsTopic = (Topic) context.lookup(topic);
TopicSubscriber subscriber = session.createDurableSubscriber(jmsTopic, topic + "-" +
sessionId);
subscriber.setMessageListener(new JmsTopicMessageListener());
topicConnection.start();
return new JmsConnectionContext(topic, topicConnection, session);
} catch(Exception e) {
logger.log(Level.SEVERE, "Topic creation and connection failed.", e);
return null;
}
}
};
return AccessController.doPrivileged(action);
而且我的 JNDI 属性配置非常简单:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming
java.naming.provider.url=10.1.3.143:1099
此外,这些罐子都使用我们的公司证书进行了签名,该证书是通过 CA 颁发的(将在接下来的几个月内到期,但仍然有效)。我还尝试清除javaws
缓存以确保它不是过时的代码问题。
那么为什么警告仍然出现?我将它作为特权操作运行,据我所知,它应该只授予代码all-permissions
来自 JNLP 文件的策略,但是当sun.rmi.transport.tcp.TCPChannel.checkConnectPermission()
在 JNDI 查找期间被调用时,JWS 安全管理器会显示安全警告。为了让 JNDI 查找具有提升的连接权限,我还需要配置其他东西吗?我可以通过 Java Web Start 进行配置吗?
更新
我还在处理这个问题。当它尝试访问服务器上的 RMI 端口时,我将对话框缩小到出现(它正在检查权限host:1098
)。我尝试将java.rmi.server.hostname
属性设置为,不使用此错误报告host
中列出的解决方法。由于第一次 RMI 查找直到客户端已经启动之后才会发生,我假设我不需要找到一种方法来通过.<property>
这是我在安全警告中单击“取消”时的堆栈跟踪:
java.security.AccessControlException: access denied (java.net.SocketPermission 10.1.3.143:1098 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at com.sun.javaws.security.JavaWebStartSecurity.checkConnect(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.checkConnectPermission(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:667)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.jboss.naming.LinkRefPairObjectFactory.getObjectInstance(LinkRefPairObjectFactory.java:85)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.jnp.interfaces.NamingContext.getObjectInstance(NamingContext.java:1273)
at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1290)
at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1298)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:763)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.ultramain.uui.jms.JmsHelper.jndiLookup(JmsHelper.java:145)
...
所以问题是特定于 RMI 访问的。为什么设置主机名不能修复对话框,正如链接的错误报告中的解决方法和我找到的其他一些资源中所建议的那样?有没有其他解决方法来解决这个问题?