正 文

JMX+J2SE5.0实现Web应用的安全管理


www.7dspace.com  更新日期:2006-3-27 15:45:24  七度空间


  六、 创建JMXServiceURL

  到现在为止,我们已经创建了一个MBeanServer并且用它注册了LoginStatsMBean。下一步是使得该服务器对客户可用。为此,我们必须创建一个JMXServiceURL-它描述了客户将用来存取该JMX服务的URL:

JMXServiceURL url = new JMXServiceURL("rmi",null,
Constants.MBEAN_SERVER_PORT,
"/jndi/rmi://localhost:" +Constants.RMI_REGISTRY_PORT +"/jmxapp");

  让我们细致地分析一下上面一行代码。该JMXServiceURL构造器使用了四个参数:

  1. 在连接时使用的协议(rmi,jmxmp,iiop,等等)。

  2. JMX服务的主机。用localhost作为参数就足够了。然而,提供null强制JMXServiceURL找到可能是最好的主机名。例如,在这种情况下,它将把null翻译成zarar-这是我的计算机的名字。

  3. JMX服务使用的端口。

  4. 最后,我们必须提供URL路径-它指示怎样找到JMX服务。在这种情况下,它会是/jndi/rmi://localhost:1099/jmxapp。

  其中,/jndi部分是指,客户必须为JMX服务做一下JNDI查询。rmi://localhost:1099指示,存在一个运行于本机的端口 1099的RMI注册。这里的jmxapp是在RMI注册中唯一标识这个JMX服务的。在JMXServiceURL对象上的一个toString()产生下列结果:

service:jmx:rmi://zarar:9589/jndi/rmi://localhost:1100/jmxapp

  上面是客户将最终使用来连接到该JMX服务的URL。J2SE 5.0文档有关于这个URL结构的更为详细的解释。

  (一) 保护服务

  J2SE 5.0提供了一种有利于JMX用一种容易的方式进行用户认证的机制。我创建了一个简单的文本文件-它存储用户名和口令信息。文件的内容是:

zarar siddiqi
fyodor dostoevsky

  用户zarar和fyodor被分别通过口令siddiqi和dostoevsky认证。下一步是创建并保护一个 JMXConnectorServer,它暴露了该MbeanServer。username/password文件的路径被存储在该键下的一个映射中- jmx.remote.x.password.file。这个映射在以后创建JMXConnectorServer时使用。

ServletContext context = Config.getServletContext();
//得到存储jmx用户信息的文件
String userFile =context.getRealPath("/")+"/WEB-INF/classes/"+Constants.JMX_USERS_FILE;
//创建authenticator并且初始化RMI服务器
Map<string> env = new HashMap<string>();
env.put("jmx.remote.x.password.file", userFile);
现在,让我们创建JMXConnectorServer。下面一行代码完成这一功能:
connectorServer = JMXConnectorServerFactory.
newJMXConnectorServer(url, env, server);

  这个JMXConnectorServerFactory.newJMXConnectorServer(JMXServiceURL,Map, MBeanServer)方法使用我们刚创建的三个对象作为参数-它们是JMXServiceURL,存储认证信息的映射和MBeanServer。其中,connectorServer实例变量允许我们分别在应用程序启动和停止时,分别用start()和stop()来启动和停止 JMXConnectorServer。

  提示 尽管JSR 160的J2SE 5.0实现相当有力;但是另外的实现,例如MX4J,也提供了一些类-它们提供了方便的特性,例如口令混淆,也就是PasswordAuthenticator类。

  七、 启动RMI注册

  在早些时候,我提到RMI注册并且指出当访问服务时执行一个JNDI查询。然而,现在我们没有一个正运行的RMI注册,因此一个JNDI查询将失败。一个RMI注册的启动可以用手工方式或编程方式来实现。

  (一) 使用命令行

  在你的Windows或Linux命令行上,输入下列一名来启动一个RMI注册:

rmiregistry &

  这将启动你的默认主机和端口(分别是localhost和1109)的RMI注册。然而,对于我们的web应用程序来说,我们不可能依赖一个在应用程序启动时可用的RMI而宁愿用编程方式来实现之。

  (二) 以编程方式启动RMI注册

  为了以编程方式启动RMI注册,你可以使用LocateRegistry.createRegistry(int port)方法。该方法返回类型注册的一个对象。当我们想在应用程序一端终止这个注册时,我们保存这个参考。就在我们启动我们的在 JMXAgent.start()中的JMXConnectorServer之前,我们首先启动RMI注册,使用下列代码行:

registry = LocateRegistry.createRegistry(Constants.RMI_REGISTRY_PORT);

  在应用程序一端,在JMXAgent.stop()中停止JMXConnectorServer之后,调用下列方法来终止该注册:

UnicastRemoteObject.unexportObject(registry,true);

  注意,StartupListener类触发了应用程序开始和结束任务。

3页,页码:[1] [2] [3] 

上一篇:网络应用技巧 用注册表强化网上邻居
下一篇:拒绝“骚扰”XP SP2中关闭安全中心提示
JMX+J2SE5.0实现Web应用的安全管理 作者:朱先忠编译 来源:天极网
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐