JForum源代码研究—Cookie,Session

 

先熟悉一下javax.servlet.http.Cookie和javax.servlet.http.HttpSession。

 

JForum系统有一项功能是:实时显示在线的注册会员数、匿名访客数。

 

登录本机的JForum,并选择“自动登录”后,可以看到如下的Cookie信息:

 

SystemGlobals.properties中关于Cookie的配置如下:

cookie.name.data = jforumUserId
cookie.name.user = jforumUserInfo
cookie.name.autologin = jforumAutoLogin
cookie.name.userHash = jforumUserHash

 

在Eclipse中,使用“文件搜索”搜索“COOKIE_NAME_USER”,只有一条记录。可见,在2.1.8版本中根本没有用到jforumUserInfo。

 

jforumUserId的值为jforum_users表中user_id列的值,匿名用户的user_id为1。登录时如果选择了“自动登录”,则jforumAutoLogin的值为1,jforumUserHash的值为一个散列值,否则,客户端不会有jforumAutoLogin和jforumUserHash。

 

jforumUserHash的生成规则如下(即systemHash):

// Generate the user-specific hash
String systemHash = MD5.crypt(SystemGlobals.getValue(ConfigKeys.USER_HASH_SEQUENCE) + user.getId());
String userHash = MD5.crypt(System.currentTimeMillis() + systemHash);
					
// Persist the user hash
UserDAO dao = DataAccessDriver.getInstance().newUserDAO();
dao.saveUserAuthHash(user.getId(), userHash);
					
systemHash = MD5.crypt(userHash);

  其中,SystemGlobals.getValue()是读取配置值,默认值为:

user.hash.sequence = 04904SDFfhfh449911-**%$nvMDFHDhskda6546546as4df4ads6f54ads654

在正式环境下使用JForum时,应该修改该值。

 

net.jforum.entities.UserSession用于抽象用户会话信息。很奇怪它的构造函数:

	public UserSession() {}

	public UserSession(UserSession us)
	{
		if (us.getStartTime() != null) {
			this.startTime = new Date(us.getStartTime().getTime());
		}

		if (us.getLastVisit() != null) {
			this.lastVisit = new Date(us.getLastVisit().getTime());
		}
		
		this.sessionTime = us.getSessionTime();
		this.userId = us.getUserId();
		this.sessionId = us.getSessionId();
		this.username = us.getUsername();
		this.autoLogin = us.getAutoLogin();
		this.lang = us.getLang();
		this.privateMessages = us.getPrivateMessages();
		this.imageCaptcha = us.imageCaptcha;
		this.ip = us.getIp();
	}

  用一个UserSession对象来构造另一个UserSession对象?第6、10行,为什么不直接this.startTime = us.getStartTime();而多此一举呢?我觉得这样做的目的是想实现“clone”效果,利用一个UserSession对象,克隆另一个UserSession对象。

 

 

关于net.jforum.SessionFacade类

从类名中Facade单词中可以看出,作者想让SessionFacade担任UserSession的门面,即门面模式。门面模式是对象的结构模式。外部与一个子系统的通信必须通过一个统一的门面对象进行,这就是门面模式。[1]     在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。[2]    具体到JForum而言,“子系统”包括:UserSession类、CacheEngine实现类以及和Session DAO方法相关的类。SessionFacade类中除了setCacheEngine()方法外,都是静态方法,也算是单例类了。这些和教科书中所说的还是比较一致的。

 

门面不是不能越过的。JForum中也有一小部分代码直接使用的UserSession us = new UserSession(); us.方法调用,即越过了SessionFacade门面。

 

让我们再读一下《Java与模式》第32章 门面(Facade)模式和《设计模式》第4.5节 FACADE(外观)——对象结构模式吧。

 

 

 

[1] 引自《Java与模式》P561

[2] 引自《Java与模式》P563

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
附录A是JForum性能测试计划文档的下载链接。根据文档中的介绍,该性能测试计划旨在对JForum的性能进行评估和测试。这对于了解JForum在各种负载条件下的表现以及其各个功能的稳定性和可靠性非常重要。 性能测试计划文档包含了测试的目标和范围、测试环境的配置、测试用例的设计和实施以及测试结果的分析等内容。下载该文档可以帮助我们更好地了解JForum在实际使用中的性能表现,以及可能存在的瓶颈和问题,为进一步优化和改进JForum提供参考依据。 在进行性能测试前,我们需要先根据文档中提供的测试环境配置要求,搭建相应的测试环境,包括安装和配置JForum的服务器和数据库等。然后,根据测试用例的设计,模拟并生成各种使用情况下的负载和压力,对JForum进行全面的性能测试。 在进行测试时,我们需要记录测试过程中的各项指标,如响应时间、吞吐量、并发用户数等,以便后续的分析和比较。测试结果的分析将帮助我们评估JForum在不同负载下的性能表现,找出可能存在的性能瓶颈,并提供相应的改进措施。通过性能测试计划文档的下载和实施,可以为JForum的性能优化和改进提供重要的参考和依据。 总之,附录A中的性能测试计划文档将为我们评估和改进JForum的性能提供重要的指导和支持。通过下载该文档并按照其中的指导进行实施,我们可以更好地了解JForum在实际使用中的性能表现,并为其优化和改进提供有效的参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值