AppFuse项目研究.docx
- 文档编号:3282645
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:70
- 大小:113.58KB
AppFuse项目研究.docx
《AppFuse项目研究.docx》由会员分享,可在线阅读,更多相关《AppFuse项目研究.docx(70页珍藏版)》请在冰豆网上搜索。
AppFuse项目研究
AppFuse项目研究
-------摘自AppFuseinchina
Ø第一部分:
初始化
1. 初始化配置信息:
Appfuse利用监听器,在应用程序启动时,初始化配置信息
★监听器StartupListener功能:
取得DAO.TYPE信息和角色信息,存入全局应用环境上下文,初始化Spring,使之可用。
★应用:
web.xml
★StartupListener监听器:
继承于Spring的ContextLoaderListener和Sevelet的
ServletContextListener,配置于Web.xml中。
★说明:
凡是继承ServletContextListener接口的类,在web容器启动时调用其
contextInitialized方法进行初始化,当容器关闭时调用其contextDestroyed的方
法进行销毁,我们可以利用这个特性初始化一些信息。
★程序说明:
(主要代码)
publicclassStartupListenerextendsContextLoaderListener
implementsServletContextListener{
publicvoidcontextInitialized(ServletContextEventevent){
//容器启动时,自动调用contextInitialized函数。
//取得全局ApplicationScope环境上下文
ServletContextcontext=event.getServletContext();
Mapconfig=(HashMap)context.getAttribute(Constants.CONFIG);
//将DAO_TYPE_HIBERNATE="hibernate"写入ServletContext
config.put(Constants.DAO_TYPE,daoType);
context.setAttribute(Constants.CONFIG,config);
//调用setupContext(context)函数初始化Spring
publicstaticvoidsetupContext(ServletContextcontext){
//初始化Spring环境上下文,为getBean作准备,并且将ServletContext
//交给Spring管理
ApplicationContextctx=
WebApplicationContextUtils.getRequiredWebApplicationContext(context);
//LookupManager为接口类,提供统一的调用接口
//通过Ico反射注入,查找lookupManager和Dao属性。
(1)
LookupManagermgr=(LookupManager)ctx.getBean("lookupManager");
//取得角色信息,存入ServletContextscope中。
context.setAttribute(Constants.AVAILABLE_ROLES,mgr.getAllRoles());
}
(1)的说明:
在配置文件中取值,动态加载LookupManagerImpl类
客户面对接口LookupManager,底层实现为LookupManagerImpl,Spring的一大
特点:
自然的面向接口编程。
LookupManagerImpl是POJO的管理类,真正的
数据操作委派给它的引用LookupDAO的具体实现类LookupDAOHibernate
Spring配置文件applicationContext-service.xml
(2)
(2)的说明:
通过Ico动态加载对象属性LookupDAOHibernate
Spring配置文件:
applicationContext-hibernate.xml
--LookupDAO:
Hibernateimplementation-->
publicclassLookupManagerImplextendsBaseManagerimplementsLookupManager{
privateLookupDAOdao;
publicvoidsetLookupDAO(LookupDAOdao){
//Spring动态注入dao引用,从配置文件中取得具体的lookupDAO,又一次的面向//接口编程
this.dao=dao;
}
publicListgetAllRoles(){
//LookupManagerImpl将真正的数据操作委派个LookupDAOHibernate(3)
Listroles=dao.getRoles();
Listlist=newArrayList();
Rolerole=null;
for(inti=0;i role=(Role)roles.get(i); list.add(newLabelValue(role.getName(),role.getName())); } returnlist; } } 应用程序启动时,调用StartupListener初始化ServletCOntext环境变量、Spring环境变量和取得角色信息后,接着执行UserCounterListener监听器。 ★UserCounterListener功能: 计算使用应用的用户个数和存储用户对象。 应用启动使初始化用户数变量counter,并存入ServletContext,利用HttpSessionAttributeListener监听器每当Session中的属性值有变化时,修改ServletContext中的用户个数和,用户对象。 提供了一种全局跟踪用户信息的方法。 UserCounterListener监听器实现比较简单,主要时理解ServletContextListener和HttpSessionAttributeListener监听器的使用。 ★web.xml ★ UserCounterListener监听器程序: UserCounterListener出来继承了ServletContextListener监听器接口外,还继承了 HttpSessionAttributeListener监听器接口。 ServletContextListener监听器接口的作用已经在“初始化”前一部分作了介绍。 ★ HttpSessionAttributeListener监听器介绍: HttpSessionAttributeListener监听 HttpSession中的属性的操作。 当在Session增加一个属性时,激发 attributeAdded(HttpSessionBindingEventse)方法;当在Session删除一个属性时,激发 attributeRemoved(HttpSessionBindingEventse)方法;当在Session属性被重新设置时,激 发attributeReplaced(HttpSessionBindingEventse)方法。 publicclassUserCounterListenerimplementsServletContextListener, HttpSessionAttributeListener{ publicstaticfinalStringCOUNT_KEY="userCounter"; publicstaticfinalStringUSERS_KEY="userNames"; privatefinaltransientLoglog=LogFactory.getLog(UserCounterListener.class); privatetransientServletContextservletContext; privateintcounter; privateSetusers; publicsynchronizedvoidcontextInitialized(ServletContextEventsce){ servletContext=sce.getServletContext(); servletContext.setAttribute((COUNT_KEY),Integer.toString(counter)); } publicsynchronizedvoidcontextDestroyed(ServletContextEventevent){ servletContext=null; users=null; counter=0; } synchronizedvoidincrementUserCounter(){ counter= Integer.parseInt((String)servletContext.getAttribute(COUNT_KEY)); counter++; servletContext.setAttribute(COUNT_KEY,Integer.toString(counter)); if(log.isDebugEnabled()){ log.debug("UserCount: "+counter); } } synchronizedvoiddecrementUserCounter(){ intcounter= Integer.parseInt((String)servletContext.getAttribute(COUNT_KEY)); counter--; if(counter<0){ counter=0; } servletContext.setAttribute(COUNT_KEY,Integer.toString(counter)); if(log.isDebugEnabled()){ log.debug("UserCount: "+counter); } } synchronizedvoidaddUsername(Objectuser){ users=(Set)servletContext.getAttribute(USERS_KEY); if(users==null){ users=newHashSet(); } if(log.isDebugEnabled()){ if(users.contains(user)){ log.debug("Useralreadyloggedin,addinganyway..."); } } users.add(user); servletContext.setAttribute(USERS_KEY,users); incrementUserCounter(); } synchronizedvoidremoveUsername(Objectuser){ users=(Set)servletContext.getAttribute(USERS_KEY); if(users! =null){ users.remove(user); } servletContext.setAttribute(USERS_KEY,users); decrementUserCounter(); } publicvoidattributeAdded(HttpSessionBindingEventevent){ if(event.getName().equals(Constants.USER_KEY)){ addUsername(event.getValue()); } } publicvoidattributeRemoved(HttpSessionBindingEventevent){ if(event.getName().equals(Constants.USER_KEY)){ removeUsername(event.getValue()); } } publicvoidattributeReplaced(HttpSessionBindingEventevent){ //Idon'treallycareiftheuserchangestheirinformation } } 图表1管理器类图 (3) 的说明: LookupDAOHibernate类 图表2实体类图 publicclassLookupDAOHibernateextendsBaseDAOHibernateimplementsLookupDAO{ publicListgetRoles(){ if(log.isDebugEnabled()){ log.debug("retrievingallrolenames..."); } returngetHibernateTemplate().find("fromRoleorderbyname"); } } 集成Spring,StartupListener通过管理类LookupManagerImpl,委派LookupDAOHibernate类取得所有角色信息。 然后将角色信息列表存入ServletContext环境上下文中。 StartupListener结束. 第二部分: 权限认证 Appfuse的用户管理,它用到了容器管理的Form认证方式。 1.appfuse应用采用基于表单的登陆验证方式,登陆请求由login.jsp处理。 web.xml 2.通过静态应用,login.jsp将登陆请求委派给loginForm.js处理 login.jsp importurl="/WEB-INF/pages/loginForm.jsp"/> 3.登陆请求由loginservlet截获处理 WEB-INF/pages/loginFrom.jsp —此处/authorize访问被Servlet拦截--> urlvalue="/authorize"/>" onsubmit="saveUsername(this);returnvalidateForm(this)"> web.xml <使用SSL安全套接字> --LoginServlet截获用户登陆请求--> 4.处理登陆请求的LoginServlet,它出来初始化参数,生成处理过后的URL,然后在交由 LoginFilter处理 publicvoidinit()throwsServletException{ //取得初始化参数 authURL=getInitParameter(Constants.AUTH_URL); algorithm=getInitParameter(Constants.ENC_ALGORITHM); secure=Boolean.valueOf(getInitParameter("isSecure")); encrypt=Boolean.valueOf(getInitParameter("encrypt-password")); //存储安全认证参数 config.put(Constants.HTTP_PORT,httpPort); config.put(Constants.HTTPS_PORT,httpsPort); //classConstants中的定义 //publicstaticfinalStringSECURE_LOGIN="secureLogin"; config.put(Constants.SECURE_LOGIN,secure); config.put(Constants.ENC_ALGORITHM,algorithm); config.put(Constants.ENCRYPT_PASSWORD,encrypt); ctx.setAttribute(Constants.CONFIG,config); ★ 以下为appfuse表单认证设置 Web.xml中的设置 —任何用户都可以访问passwordHintandsignup-->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AppFuse 项目 研究