AppFuse项目研究.docx

上传人:b****6 文档编号:3282645 上传时间:2022-11-21 格式:DOCX 页数:70 大小:113.58KB
下载 相关 举报
AppFuse项目研究.docx_第1页
第1页 / 共70页
AppFuse项目研究.docx_第2页
第2页 / 共70页
AppFuse项目研究.docx_第3页
第3页 / 共70页
AppFuse项目研究.docx_第4页
第4页 / 共70页
AppFuse项目研究.docx_第5页
第5页 / 共70页
点击查看更多>>
下载资源
资源描述

AppFuse项目研究.docx

《AppFuse项目研究.docx》由会员分享,可在线阅读,更多相关《AppFuse项目研究.docx(70页珍藏版)》请在冰豆网上搜索。

AppFuse项目研究.docx

AppFuse项目研究

AppFuse项目研究

-------摘自AppFuseinchina

Ø第一部分:

初始化

1. 初始化配置信息:

Appfuse利用监听器,在应用程序启动时,初始化配置信息

★监听器StartupListener功能:

取得DAO.TYPE信息和角色信息,存入全局应用环境上下文,初始化Spring,使之可用。

★应用:

web.xml

  

       org.dudu.webapp.listener.StartupListener

     

★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

org.dudu.webapp.listener.UserCounterListener

★    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

FORM

/login.jsp

/loginError.jsp

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

listenPort_http

8080

<使用SSL安全套接字>

listenPort_https

8443

  

--LoginServlet截获用户登陆请求-->

login

LoginServlet

org.appfuse.webapp.action.LoginServlet

authURL

j_security_check

isSecure

false

encrypt-password

true

algorithm

SHA

1

 

login

/authorize/*

 

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-->

Unrestricted

Alluserscanview

/passwordHint.html

/signup.html

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1