Welcome 微信登录

首页 / 软件开发 / JAVA / JMX+J2SE5.0实现Web应用的安全管理

JMX+J2SE5.0实现Web应用的安全管理2011-07-29一、 引言

JMX(Java管理扩展)提供了一组工具用来管理本地和远程应用程序、系统对象、设备等。本文将解释如何使用JMX(JSR 160)来远程控制Web应用程序,并将解释应用程序中可用于JMX客户的代码,同时将展示使用如MC4J和jManage等的不同客户如何连接到支持JMX的应用程序。此外,我们还将详细地讨论使用RMI协议和JNDI来保护通讯层。

首先我们要分析一个简单的web应用程序,它监控已经登陆的用户数目并通过一个安全的JMX服务来显示该项统计。我们还将运行这个应用程序的多个实例并且从所有的运行实例中跟踪这个统计数字。当然,你可以下载这个示例web应用程序。它需要你安装J2SE 5.0 SDK并且你的JAVA_HOME环境变量指向基安装目录。J2SE 5.0实现了1.2版本的JMX API和JMX 1.0版本的Remote API。同时还需要一个支持Servlet的容器;我使用的是Apache Tomcat 5.5.12。另外,我还使用Apache Ant来构建这一示例应用程序。

二、 建立示例应用程序

首先,你要下载示例应用程序并且使用ant war(更多的细节见build.XML中的注释)来创建一个WAR文件。把jmxapp.war复制到Tomcat的webapps目录。假定Tomcat正在运行于你的本地机器的端口8080,那么该应用程序的URL将是:

http://localhost:8080/jmxapp

如果你看到一个提示你输入名字和口令的登陆屏幕,那么一切已经就绪了。

三、 跟踪一些有意义的数据

本文中的应用程序使用Struts框架来提交登录表单。一旦提交结束,即执行LoginAction.execute(..)方法-它将简单地检查是否用户的ID为"hello"以及是否其口令为"world"。如果二者都正确,那么登录成功并且控制被导向login_success.JSP;如果不正确,那么我们返回到登录表单。根据登录成功与否决定调用incrementSuccessLogins(HttpServletRequest)方法还是incrementFailedLogins(HttpServletRequest)方法。现在,让我们先分析一下incrementFailedLogins(HttpServletRequest):

private void incrementFailedLogins(HttpServletRequest request) {
HttpSession session = request.getSession();
ServletContext context =session.getServletContext();
Integer num = (Integer) context.getAttribute( Constants.FAILED_LOGINS_KEY);
int newValue = 1;
if (num != null) { newValue = num.intValue() + 1; }
context.setAttribute( Constants.FAILED_LOGINS_KEY, new Integer(newValue));
}

这个方法增加一个在应用程序范围存储的FAILED_LOGINS_KEY变量。这个incrementSuccessLogins(HttpServletRequest)方法是以相似的方法实现的。该应用程序追踪有多少人成功地登录和有多少人认证失败。这真不错,但是我们该如何存取这些数据?这就是引入JMX的原因。