知识大全 关于JSP中基于Session的在线用户统计分析
Posted 时间
篇首语:节俭是致富的秘诀。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于JSP中基于Session的在线用户统计分析相关的知识,希望对你有一定的参考价值。
关于JSP中基于Session的在线用户统计分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
JSP作为后起之秀能够在服务器编程环境中占据一定地位 是和它良好支持一系列业界标准密切相关的 Session就是它提供的基础设施之一 作为一个程序员 你可以不介意具体在客户端是如何实现 就方便的实现简单的基于session的用户管理 现在对于处理在线用户 有几种不同的处理方法
一种是页面刷新由用户控制 服务器端控制一个超时时间比如 分钟 到了时间之后用户没有动作就被踢出 这种方法的优点是 如果用户忘了退出 可以防止别人恶意操作 缺点是 如果你在做一件很耗时间的事情 超过了这个时间限制 submit的时候可能要再次面临登陆 如果原来的叶面又是强制失效的话 就有可能丢失你做的工作 在实现的角度来看 这是最简单的 Server端默认实现的就是这样的模式
另一种方式是 站点采用框架结构 有一个Frame或者隐藏的iframe在不断刷新 这样你永远不会被踢出 但是服务器端为了判断你是否在线 需要定一个发呆时间 如果超过这个发呆时间你除了这个自动刷新的页面外没有刷新其他页面的话 就认为你已经不在线了 采取这种方式的典型是xici net 他的优点是可以可以利用不断的刷新实现一些类似server push的功能 比如网友之间发送消息
不管哪一种模式 为了实现浏览当前所有的在线用户 还需要做一些额外的工作 Servlet API中没有得到Session列表的API
可以利用的是Listener Servlet 和 规范在这里略微有一些不一样 中HttpSessionBindingListener可以实现当一个HTTPSession中的Attribute变化的时候通知你的类 而 中还引入了HttpSessionAttributeListener 鉴于我使用的环境是Visual age for Java 和JRun server 他们还不直接支持Servlet 的编程 这里我用的是HttpSessionBindingListener
需要做的事情包括做一个新的类来实现HttpSessionBindingListener接口 这个接口有两个方法
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event)
当你执行Session addAttribute(String Object)的时候 如果你已经把一个实现了HttpSessionBindingListener接口的类加入为Attribute Session会通知你的类 调用你的valueBound方法 相反 Session removeAttribute方法对应的是valueUndound方法
public class HttpSessionBinding implements javax servlet
ServletContext application = null;
public HttpSessionBinding(ServletContext application)
super();
if (application ==null)
throw new IllegalArgumentException("Null application is not accept ");
this application = application;
public void valueBound(javax servlet
Vector activeSessions = (Vector) application getAttribute("activeSessions");
if (activeSessions == null)
activeSessions = new Vector();
JDBCUser sessionUser = (JDBCUser)e getSession() getAttribute("user");
if (sessionUser != null)
activeSessions add(e getSession());
application setAttribute("activeSessions" activeSessions);
public void valueUnbound(javax servlet
JDBCUser sessionUser = (JDBCUser)e getSession() getAttribute("user");
if (sessionUser == null)
Vector activeSessions = (Vector) application getAttribute("activeSessions");
if (activeSessions != null)
activeSessions remove(e getSession() getId());
application setAttribute("activeSessions" activeSessions);
假设其中的JDBCUser类是一个任意User类 在执行用户登录时 把User类和HttpSessionBinding类都加入到Session中去
这样 每次用户登录后 在application中的attribute "activeSessions"这个vector中都会增加一条记录 每当session超时 valueUnbound被触发 在这个vector中删去将要被超时的session
public void login()
throws ACLException SQLException IOException
/* get JDBC User Class */
if (user != null)
logout();
// if session time out or user didn t login save the target url temporary
JDBCUserFactory uf = new JDBCUserFactory();
if ( (this request getParameter("userID")==null) || (this request getParameter("password")==null) )
throw new ACLException("Please input a valid userName and password ");
JDBCUser user = (JDBCUser) uf UserLogin(
this request getParameter("userID")
this request getParameter("password") );
user touchLoginTime();
this session setAttribute("user" user);
this session setAttribute("BindingNotify" new HttpSessionBinding(application));
Login的时候 把User和这个BindingNotofy目的的类都加入到session中去 logout的时候 就要主动在activeSessions这个vector中删去这个session
public void logout()
throws SQLException ACLException
if (this user == null && this session getAttribute("user")==null)
return;
Vector activeSessions = (Vector) this application getAttribute("activeSessions");
if (activeSessions != null)
activeSessions remove(this session);
application setAttribute("activeSessions" activeSessions);
java util Enumeration e = this session getAttributeNames();
while (e hasMoreElements())
String s = (String)e nextElement();
this session removeAttribute(s);
this user touchLogoutTime();
this user = null;
这两个函数位于一个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 e )
response sendRedirect("InsufficientPrivilege jsp?detail=Invalid% Password");
return;
catch ( Exception e )
%> Error:<%=e toString() %><br>
Press <a href="login jsp">Here</a> to relogin
<% return;
response sendRedirect("index jsp");%>
再来看看现在我们怎么得到一个当前在线的用户列表
<body bgcolor="#FFFFFF">
<table cellspacing=" " cellpadding=" " width= %>
<tr >
<td >SessionId
</td>
<td >User
</td>
<td >Login Time
</td>
<td >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 nowrap= >
<%= BeaconDate getInstance( new java util Date(sess getLastAccessedTime())) getDateTimeString()%></td>
</tr>
<%
%>
</table>
</body>
以上的代码从application中取出activeSessions 并且显示出具体的时间 其中BeaconDate类假设为格式化时间的类
这样 我们得到了一个察看在线用户的列表的框架 至于在线用户列表分页等功能 与本文无关 不予讨论
cha138/Article/program/Java/JSP/201311/20547相关参考
知识大全 关于JSP中基于Session的在线用户统计分析[3]
关于JSP中基于Session的在线用户统计分析[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
知识大全 关于JSP中基于Session的在线用户统计分析[2]
关于JSP中基于Session的在线用户统计分析[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
asp教程简单在线用户统计代码这代码是用了aspapliction与session实例的哦<scriptlanguage="vbscript"runat="server">subApp
ASP.NET中在线用户统计 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 统计在线用户的作用不
知识大全 php中如何同时使用session和cookie来保存用户登录信息
本篇文章是对在php中同时使用session和cookie来保存用户登录信息的实现代码进行了详细的分析介绍需要的朋友参考下 同时使用session和cookie来保存用户登录信息数据库连
首先写个类: importjavaxservlet*; importjavaxservlet*; publicclassSessionCounterimplementsHttpSession
JSP页面中Session对象详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Session
cha138/Article/program/Java/Javascript/201311/25508
最普通的方法是用SESSION但缺点是无法即时反应在线情况(有超时时间)和占用服务器资源(如果有人在线就有个SESSION想想看)上次(好象间隔很久了耶)介绍了一种采用APPLICATION+COOK
防止重复在线统计在线人数通常由三种办法:通过数据库的记录使用ServletContext类型的application采用session第一种做法较简单但会给数据库造成负担第二种做法还没去实现:)本