[转载] jive的工作内幕

作者:Cherami 
email:cherami@javaresearch.org
日期:2002.6.2 

         本文向您揭示jive内部的工作方式和特性,包括使用哪个类完成什么样的功能。由于jsp页面的内容大家都可以看到,如何工作的大家看看其内容即可知道,因此本文重点解释核心类中的功能,另外,在分析的过程中笔者会给出对某些内容的解析和自己的看法,希望能对你有用。:)

在jive众多的页面中,其实只有一个页面是最关键的,即golbal.jsp,之所以如此是因为此页面被其它绝大多数的页面所包含,而此页面完成的功能对这整个论坛也是最关键的,即验证授权并据此生成ForumFactory,其它页面都是根据授权和ForumFactory生成需要的内容,不再涉及核心,所有的验证工作全部交给了那两个对象并完成了应用的过虑。后面的内容将根据global.jsp的内容一步一步的分析并探究其最终实现。 
1、设置缺省的显示参数,包括每页显示多少个帖子以及其它可选值(这些值笔者认为应该放在jive核心类中,作为常量,因为这些值可以通过修改jsp文件非常容易的修改,而设置后的值存入了配置文件或者数据库后进行修改,那么必将产生矛盾甚至导致页面显示错误,而且此页面中定义了一些方法,这些方法也应该被定义在某个类中,例如SkinUtils就是一个好的选择,因为这些方法的功能都应该是SkinUtils这个类表明应该完成的功能。) 
2、调用SkinUtils.getUserAuthorization(request, response)读取用户授权,先从session中读取,如果存在,则返回该授权,如果不存在,则读取客户端cookie中的自动登录cookie,如果存在该cookie则提取其中的信息并调用解码方法decodePasswordCookie解析其中的信息(此处需要指明的就是安全性的问题,因为虽然存在于cookie中的用户名和密码信息是经过一些算法进行了加密,但是这个加密是可逆的,使用SkinUtils的decodePasswordCookie方法即可获得其解密的明文,因此如果你不能确定你所使用的计算机只有你一个人使用,那么不要设置自动登陆,如果你不担心自己的密码被人窃取,那么设置也没有关系了。在数据库中存储的密码是不用担心安全问题的,因为存入数据库的密码是使用MD5加密的数据,即使是系统管理员也无法获知其密码明文)并调用AuthorizationFactory.getAuthorization(username,password)完成授权(此处的password已经是解密的明文了,另外需要说明的是这个生成授权对象的过程中是使用Class的newInstance()方式生成新的实例,系统中其它的生成具体对象的方式也和这个相同,值得特别指出的是在生成的过程中实际上是先查看配置文件jive_config.xml中是否规定了要生成的类的类名,没有规定才使用内定的DbAuthorization,这样的一个极大好处是可以不修改jive核心类而是从它的接口中实现自己的子类然后在配置文件中指明,这样就具有极大的灵活性,使用这个特性,我们可以达到整个系统根据需要使用不同的实现方式,例如用户信息等存入数据库,而消息内容等可以自己实现XML方式,这样可以节省数据库空间),否则返回null;如果SkinUtils.getUserAuthorization返回一个null,则授权为来客 
3、调用ForumFactory.getInstance(authToken)得到一个ForumFactory对象,该方法会根据授权创建一个新的ForumFactoryProxy对象,因为在ForumFactory类中定义了一个static的ForumFactory对象,而getInstance实际上返回的是经过封装的那个对象的唯一实例(使用惰性初始化方式),因此实际上整个论坛系统仅仅只有一个ForumFactory,之所以不同用户能有不同的显示内容和方式是因为它的代理类ForumFactoryProxy(这个代理类也可以看作是ForumFactory的封装器Wrapper)根据授权和用户信息进行了过虑,这也是使用代理方式的目的。(有一点笔者感觉很奇怪,在ForumFactory的实现类DbForumFactory中,UserManager和GroupManager成员的类型都是以其接口申明的,而其它的SearchManager等则都是使用其实现类DbSearchManager申明的,查看源代码发现这些实现类并没有增加什么新的public方法,只是增加了一些protected和private方法,而在DbForumFactory中实际也没有调用那些方法,因此完全可以将其类型申明为其原始的接口,这样系统的灵活性和统一性也更好,但是代码这样申明的意义何在呢?) 
4、如果不是来客授权则根据其用户ID生成一个User对象:forumFactory.getUserManager().getUser(authToken.getUserID()),在其实现中,先查看用户缓存功能是否打开,如果没有打开则直接根据用户ID生成一个新的对象,否则先查看缓存中是否存在该用户的信息,如果存在则返回,如果不存在则创建一个新的对象并将之存入缓存。(在查看缓存的实现方式时,以这里的UserCache为例,它是DatabaseCache的子类,增加了一个Cache成员,而DatabaseCache中也仅仅是封装了一个LongCache成员,而LongCache实现了Cacheable接口并在其中封装了三个集合类:LongHashMap和两个LongLinkedList,分别代表缓存的对象,缓存对象的最近访问顺序以及加入缓存的顺序,这些类都是自己实现的,笔者感觉这些功能都是可以由JDK的核心集合框架可以实现的功能,可能是因为jive在早期开发的时候还没有集合框架因此使用了自己来实现的方式,笔者没有仔细的研究这些集合类的实现方式和特性) 
5、调用SkinUtils.getLastVisited(request,response)得到用户的上次访问时间,实际的工作状况是先从session中读取,如果存在,则提取出来并存入cookie,如果不存在,则从客户端cookie中查找是否保存上次访问信息的cookie,有则提取,将上次访问时间存入session并且向客户端写入cookie。(这个实现方式笔者觉得有一个问题,那就是如果用户在一台计算机上访问了论坛,然后在其它的计算机上又访问了论坛,那么下次他使用前一台计算机访问论坛得到的上次访问时间实际上是错误的,上次访问时间应该是存入数据库比较好,可能是笔者理解的上次访问时间和jive论坛的理解不同吧,按照其实现方式,上次访问时间应该是指用户在同一计算机上的上次访问时间?) 
6、根据用户设置读取其设定的每页显示的消息数,没有设置则使用缺省值。 

在以上的说明中还没有提到的两个非常重要的类是PermissionsManager和ForumPermissions,上面的Authorization其实只是用户ID的一种封装,只是充当一种标志,真正的权限授予是由PermissionsManager根据论坛ID和用户ID来授予的,PermissionsManager对象是作为ForumFactory的实现类DbForumFactory的成员存在的,而ForumPermissions是作为ForumFactory的代理ForumFactoryProxy的成员存在的,而其真正的实例化还是通过DbForumFactory的PermissionsManager的getFinalUserPerms方法得到的。在系统的使用过程中,用户ID是可以发生变化的,因此其权限也是在变动的。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值