软件项目实训及课程设计指导——如何在J2EE平台项目中实现性能监控、安全控制等方面的功能
1.1.1 基于面向切面AOP设计思想的系统架构设计实现性能监控的应用示例
1、在企业应用系统的后台管理中提供性能监控功能的必要性
对于Web应用系统由于涉及高并发访问等应用方面的问题,因此许多企业应用系统的管理者希望能够了解Web应用系统在实际运行中的性能状况和用户对应用系统具体访问的情况,由此期望能够在应用系统中提供有性能监控和访问分析功能。方便软件应用系统的管理者查找软件应用系统的性能瓶颈和及时对软件应用系统进行性能调优。
其实在操作系统(如Windows操作系统)和J2EE应用服务器平台软件(如BEA公司的WebLogic)中都提供有实时监控系统本身性能的工具程序。企业应用系统的开发者只需要开发实现与企业业务管理有关的系统本身的性能监控系统。
2、Web应用系统中的性能监控工具的主要功能
一个企业级的Web应用系统,在性能监控和访问分析方面的功能要求一般包括以下两个方面的应用要求。
(1)与业务有关的各种性能项目
由于不同的企业应用系统的业务类型和点是不相同的,因此作者在此也无法进行具体的指导。但一般应该要提供如按业务类型进行性能分析和数据显示、实时流量监控和流量分布分析、访问状况分析等方面的功能。
(2)与应用系统程序本身运行过程中有关的各种性能项目
开发人员在系统程序的编程开发中会出现各种资源未释放等方面的漏洞,如数据库连接、文件流对象和应用Hibernate框架时的Session对象等未释放,同时也有可能出现过多的对象创建而导致系统程序在高并发访问的状况下出现性能低下,严重的则会造成应用系统出现运行时错误。
因此,软件应用系统中的性能监控工具也应该还要监控这些方面的情况以及时了解软件应用系统本身的运行状况,保证企业级的软件应用系统稳定正常地运行而不影响企业的业务工作的开展。
3、Web应用系统中的性能监控的基本实现原理
性能监控其实也就是监测在高并发访问的状况下,软件应用系统中的特定业务功能处理方法的执行效率或者速度。为此,可以拦截目标方法的执行过程并记录目标方法执行之前和执行完毕后的时间值,并取其差值将可以得到该目标方法的执行时间。最后根据具体的功能实现要求,保存所获得的各个性能数据到系统数据库系统中。下面附录出相关的部分代码示例,读者注意其中黑体部分的代码。
package com.bluedream.webbank.profiling;import java.util.Date;public class ServerRunningTimeTracker { private long startedTime; public ServerRunningTimeTracker() { startedTime=System.currentTimeMillis(); } public long getRunningTime() { return System.currentTimeMillis()-startedTime; }}当然,对目标方法的拦截则应该应用面向切面AOP设计思想设加以设计和编程实现、并从具体的业务功能类程序代码中分离出来。
4、在银行账户信息管理系统中基于面向切面AOP思想设计和实现性能监控功能
由于作者在银行账户信息管理系统的范例中没有应用Spring框架技术,因此在性能监控功能的具体实现方面没有采用Spring框架中的AOP技术,而是直接应用Java动态代理技术实现。具体实现的核心功能代码片段请见下面的程序代码示例。
package com.bluedream.webbank.profiling;import java.lang.reflect.*;public class ProfilingDynamicProxy implements InvocationHandler{ private Object delegate; private long totalTime; public long getTotalTime(){ return totalTime;//返回所监控的某个业务方法执行中所花费的时间 } public Object bind(Object delegate){ //delegate为被代理的目标类对象实例 this.delegate = delegate; return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ Object result = null; long startedTime; try{ startedTime=System.currentTimeMillis(); result = method.invoke(delegate, args); totalTime=System.currentTimeMillis()-startedTime; } catch (Exception e){ .... //异常处理的代码,在此加以省略 } return result; }}对于性能监控中的各种数据的显示功能的实现,在银行账户信息管理系统项目中主要是应用开源的JFreeChart图表框架技术实现,具体的显示效果请见下图所示的局部截图。
注意:
开源JFreeChart图表框架具体的应用技术请读者参考"J2EE项目实训--Struts框架技术"一书中的第10章"整合Struts和其他框架技术"的有关内容。
1.1.2 基于面向切面AOP设计思想的系统架构设计实现安全功能的应用示例
1、对于一个成功的J2EE应用系统来说安全功能是必不可少的
由于Web应用系统是基于HTTP协议实现数据的传递,而HTTP协议底层的TCP/IP 协议在制订之初,没有把安全考虑在内,协议中存在一定的安全问题——如数据采用明文传输。
因此,基于Web方式的软件应用系统在安全方面在客观上就存在有一定的薄弱性,在网络中传输的各种敏感数据(如合同﹑金融账号、账号密码和支付信息等)可以被非授权的用户访问、阅读和修改。
因此,对于电子商务、电子政务和电子税务等基于Web 方式的各种软件应用系统,都需要确保软件应用系统本身的安全性。对一个基于Web方式的企业级应用系统的保护,一般可以从三个不同层面加以实现——首先是身份验证(Authenticate),其次是控制授权(Authorization),最后为安全传输(Secured Transmission)。
(1)身份验证
主要是判断当前的请求者是否是本软件应用系统中的合法使用者用户,这可以通过验证口令、数字证书来技术手段完成。而身份验证的具体实现方式一般是强制要求应用系统的访问者进行系统登录。
(2)控制授权
主要是判断请求者用户是否拥有访问某一资源或者产生某种行为的权限,例如判断某一请求者是否有权利调用数据访问组件中的删除数据的方法。因为数据的删除等操作是敏感性的功能操作,非法操作将导致数据的修改。
(3)安全传输
也就是需要保证客户端或者服务端的数据在网络传输过程中不会被未授权的第三者修改。这可以利用安全套接字层(Secure Socket Layer,SSL)和传输层安全性(Transport Layer Security,TLS)协议实现这两种功能。
2、对访问者的身份信息进行验证
(1)应用验证码能够有效地防止各种破解程序强行登录系统
软件应用系统通过对访问者的身份信息进行验证,以证明该访问者的身份是真实的。而只有访问者通过了系统身份验证,才可以对该访问者进行授权。在Web应用系统中,身份认证的主要实现方式是强制要求应用系统的访问者提供"用户名/密码"相关的个人信息。
但由于密码是静态的数据,在输入或者验证过程中需要在客户端的计算机内存中和在网络中传输,易被驻留在客户端的计算机内存中的各种"木马程序"或网络中的"监听程序"截获;另外,还需要防止各种破解程序强行登录软件应用系统——这可以通过强制要求访问者提供系统所提示的"验证码"。请见下图所示的登录页面表单的图示。
(2)利用J2EE Web过滤器(Filter)组件技术实现身份验证
利用J2EE Web过滤器组件实现对软件应用系统中的特定请求的URL地址进行拦截和解析,并识别是否为对敏感资源进行的请求。如果是,则再进一步识别发出请求的用户此时的身份状态信息(一般是从HttpSession对象中获得记录身份状态信息的实体组件类UserInfoVO的对象信息),然后再通过RBAC(Roled-Based Access Contro,基于角色的访问控制l)的机制,将此链接需要的访问权限与当前访问的用户拥有的权限进行比较,然后进行相应的访问控制处理。
3、对应用系统的访问者进行访问控制和功能操作授权
由于应用J2EE Web过滤器组件方法实现身份验证只能通过URL地址来反映被监控的目标资源,而不能渗透到软件应用系统内部的业务功能类中的方法,从而也就无法实现对访问者的行为进行控制和授权。
当然,不希望把对应用系统访问者的行为进行控制和授权功能实现的代码与具体的业务组件类本身直接藕合在一起。因此,可以应用面向切面AOP设计思想进行封装和隔离。为此,在银行账户信息管理系统中直接应用动态代理技术实现对访问者控制和授权。下图所示为访问者非法访问时的错误提示信息显示的局部图示。