| JMX+J2SE 5.0实现Web应用的安全管理 |
|
| 来源:天极yesky 作者:朱先忠 加入时间:2006-10-27 访问次数:10 [大 中 小] |
|
1. 创建一个MBeanServer。
2. 用MBeanServer注册LoginStatsMBean。
3. 创建一个JMXConnector以允许远程客户进行连接。
o 包含对JNDI的使用。
o 也必须有一个RMI注册运行。
4. 使用一个用户名和口令保护JMXConnector。
5. 分别在应用程序启动和停止时,启动和停止JMXConnector。
JMXAgent的类轮廓是:
public class JMXAgent { public JMXAgent() { //初始化JMX服务器 } public void start() { //启动JMX服务器 } //在应用程序结束时调用 public void stop() { //停止JMX服务器 } } | 让我们理解在该构造器的这部分代码-它能够使得客户远程地监控该应用程序。
用MBeans创建一个MBeanServer
我们首先创建一个MBeanServer对象。它是JMX基础结构的核心组件,它允许我们暴露我们的MBeans作为可管理的对象。MBeanServerFactory.createMBeanServer(String)方法使得这一任务极为轻松。所提供的参数是服务器的域。可以把它当作这个MBeanServer的唯一的名字。然后,我们用MbeanServe来注册LoginStatsMBean。MBeanServer.registerMBean(Object,ObjectName)方法使用的参数有两个:一个是MBean实现的一个实例;另一个是类型ObjectName的一个对象-它用于唯一地标识该MBean;在这种情况下,DOMAIN+":name=LoginStats"就足够了。
MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN); server.registerMBean(new LoginStats(),new ObjectName(DOMAIN+ ":name=LoginStats")); |
六、 创建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。
|
|
|
|
|
|