手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>Java技术>列表

JSP环境基于Session的在线用户统计深入分析

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


这两个函数位于一个HttpSessionManager类中.这个类引用了JSP里面的application全局
对象。
这个类的其他代码和本文无关且相当长,我就不贴出来了。

下面来看看jsp里面怎么用。
假设一个登录用的表单被提交到doLogin.jsp, 表单中包含UserName和password域。

节选部分片段:
<%

	HttpSessionManager hsm = new HttpSessionManager(application,request,response);

	try

	{

		hsm.login();

	}

	catch ( UserNotFoundException e)

	{

		response.sendRedirect("InsufficientPrivilege.jsp?detail=User does not exist.");

		return;

	}

	catch (	InvalidPasswordException e2)

	{	

		response.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid Password");

		return;

	}

	catch ( Exception e3)

	{

	%>	Error:<%=e3.toString() %><br>

		Press <a href="login.jsp">Here</a> to relogin.

<%		return;

	}

	response.sendRedirect("index.jsp");

%>



再来看看现在我们怎么得到一个当前在线的用户列表。
<body bgcolor="#FFFFFF">

<table cellspacing="0" cellpadding="0" width="100%">



	<tr >

	  <td style="width:24px">SessionId

	  </td>

	  <td style="width:80px" >User

	  </td>

	  <td style="width:80px" >Login Time

	  </td>

	  <td style="width:80px" >Last Access Time

	  </td>

	</tr>

<%

	Vector activeSessions = (Vector) application.getAttribute("activeSessions");

	if (activeSessions == null)

	{

		activeSessions = new Vector();

		application.setAttribute("activeSessions",activeSessions);

	}

	

	Iterator it = activeSessions.iterator();

	while (it.hasNext())

	{

		HttpSession sess = (HttpSession)it.next();

		JDBCUser sessionUser = (JDBCUser)sess.getAttribute("user");

		String userId = (sessionUser!=null)?sessionUser.getUserID():"None";

%>

	<tr>

	  	<td nowrap=''><%= sess.getId() %></td>

	  	<td nowrap=''><%= userId %></td>

	  	<td nowrap=''>

		<%=  BeaconDate.getInstance( new java.util.Date(sess.getCreationTime())).getDateTimeString()%></td>

	  	<td class="<%= stl %>3" nowrap=''>

		<%=  BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td>

	</tr>

<%

	}

%>

</table>

</body>



以上的代码从application中取出activeSessions,并且显示出具体的时间。其中
BeaconDate类假设为格式化时间的类。

这样,我们得到了一个察看在线用户的列表的框架。至于在线用户列表分页等功能,
与本文无关,不予讨论。
这是一个非刷新模型的例子,依赖于session的超时机制。我的同事sonymusic指出很
多时候由于各个厂商思想的不同,这有可能是不可信赖的。考虑到这种需求,需要在
每个叶面刷新的时候都判断当前用户距离上次使用的时间是否超过某一个预定时间值。
这实质上就是自己实现session超时。
如果需要实现刷新模型,就必须使用这种每个叶面进行刷新判断的方法。

上一篇: 表现层框架Struts/Tapestry/JSF架构比较
下一篇: Java对各种文件的操作详解

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!