监听HTTp会话是利用Servlet监听程序。结合监听技术,来讨论获得当前平台中用户总数的方法。
在Web应用中,可以监听HTTP会话活动情况、HTTP会话中属性的设置情况,也可以监听HTTP会话的active、passivate情况等
可以通过HttpSessionListener接口监听HTTP会话创建、销毁的信息;通过HttpSessionActivationListener监听HTTP会话的active、passivate情况;通过HttpSessionBindingListener监听HTTP会话中对象的绑定信息;通过HttpSessionAttributeListener监听HTTP会话中属性的设置请求。
下面看个实例
该实例中,SessionListener实现了HttpSessionListener接口。SessionListener类还有一个属性,就是Hashtable用来保存所有的登录信息。当创建一个Session时,就调用sessionCreate()方法将登陆会话信息保存到Hashtable中;当销毁有关Session时,就调用sessionDestroyed()方法将登陆会话信息从Hashtable中移除,这样就实现了管理在线用户登录会话信息的目的。
我们还需要几个页面程序来测试这个监听器的工作并且深入体会下Session的会话管理机制。
测试程序如下:
当访问index.jsp时会出现一个类似登录框的会话描述页面,输入会话描述后进入display.jsp显示刚才输入的会话信息。
例如
单击管理会进入会话关联页面(session.jsp)单击“注销”会进入会话注销页面(logout.jsp)是HTTP会话无效,
例如:会话关联的程序
注销会话的程序(logout.jsp)
如果单击“销毁”,则可以强制将会话信息移除如下
最后将监听器部署到web.xml中去。如下
在Web应用中,可以监听HTTP会话活动情况、HTTP会话中属性的设置情况,也可以监听HTTP会话的active、passivate情况等
可以通过HttpSessionListener接口监听HTTP会话创建、销毁的信息;通过HttpSessionActivationListener监听HTTP会话的active、passivate情况;通过HttpSessionBindingListener监听HTTP会话中对象的绑定信息;通过HttpSessionAttributeListener监听HTTP会话中属性的设置请求。
下面看个实例
package com.test.ch9;
import java.util.Hashtable;
import java.util.Iterator;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener{
//集合对象,保存session对象的引用
static Hashtable ht=new Hashtable();
//实现HttpSessionListener接口,完成session创建事件控制
public void sessionCreated(HttpSessionEvent arg0){
HttpSession session=arg0.getSession();
ht.put(session.getId(),session);
System.out.println("create session:"+session.getId());
}
//实现HttpSessionListener接口,完成session销毁事件控制
public void sessionDestroyed(HttpSessionEvent arg0){
HttpSession session=arg0.getSession();
System.out.println("destory session:"+session.getId());
ht.remove(session.getId());
}
// 返回全部session对象集合
static public Iterator getSet(){
return ht.values().iterator();
}
//依据session id返回指定的session对象
static public HttpSession getSession(String sessionId){
return (HttpSession)ht.get(sessionId);
}
}
该实例中,SessionListener实现了HttpSessionListener接口。SessionListener类还有一个属性,就是Hashtable用来保存所有的登录信息。当创建一个Session时,就调用sessionCreate()方法将登陆会话信息保存到Hashtable中;当销毁有关Session时,就调用sessionDestroyed()方法将登陆会话信息从Hashtable中移除,这样就实现了管理在线用户登录会话信息的目的。
我们还需要几个页面程序来测试这个监听器的工作并且深入体会下Session的会话管理机制。
测试程序如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%
String strName=null;
String strThing=null;
try{
strName=request.getParameter("name");
strThing=request.getParameter("thing");
if((strName==null)||(strName.length()==0)){
throw new Exception("null strName");
}
if((strThing==null)||(strThing.length()==0))
throw new Exception("null strThing");
session.setAttribute("name","strName");
session.setAttribute("thing","strThing");
response.sendRedirect("display.jsp");
}
catch(Exception e){}
%>
<html>
<head>
<title>会话管理</title>
</head>
<body>
<center>会话管理实例</center>
<form action="" method="post">
<table>
<tr>
<td>名称:</td>
<td><input name="name" type="input"/></td>
</tr>
<tr>
<td>事件:</td>
<td><input name="thing" type="input"/></td>
</tr>
<tr>
<td align="right"></td>
<td align="right">
<button type="submit">提交</button>
<button type="reset">重置</button>
</td>
</tr>
</table>
</form>
</body>
</html>
当访问index.jsp时会出现一个类似登录框的会话描述页面,输入会话描述后进入display.jsp显示刚才输入的会话信息。
例如
<%@ page language="java" pageEncoding="GB2312"%>
<!DOCTYPE HTML PUBLIC"-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>会话控制显示</title>
</head>
<body bgcolor="#FFFFFF">
<%
if(session.isNew()==true){
response.sendRedirect("index.jsp")
}
out.println("name:"+session.getAttribute("name")+"<br>");
out.println("thing:"+session.getAttribute("thing")+"<br>");
out.println("session id:"+session.getId()+"<br>");
out.println("create time:"+session.getCreateTime());
%>
<form>
<table>
<tr>
<td><a href="session.jsp">管理</a></td>
<td><a href="logout.jsp">注销</a></td>
</tr>
</table>
</form>
</body>
</html>
单击管理会进入会话关联页面(session.jsp)单击“注销”会进入会话注销页面(logout.jsp)是HTTP会话无效,
例如:会话关联的程序
<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="com.test.ch9.*, java.util.*"%>
<!DOCTYPE HTML PUBLIC"-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Manager session JSP</title>
</head>
<body bgcolor="#FFFFFF">
会话管理
<br>
<table border="1">
<tr bgcolor="yellow">
<td>会话Id</td>
<td>用户名</td>
<td>事件</td>
<td>创建时间</td>
<td>操作</td>
</tr>
<%
Iterator iterator=SessionListener.getSet();
while(iterator.hasNext()){
try{
HttpSession session1=(HttpSession)iterator.next();
out.println("<tr>");
out.println("<td>"+session1.getId()+"</td>")
out.println("<td>"+session1.getAttribute("name")+"</td>");
out.println("<td>"+session1.getAttribute("thing")+"</td>")
out.println("<td>"+session1.getCreationTime()+"</td>");
%>
<td><a href='end.jsp?sessionid=<%=session1.getId()%>'>销毁</a></td>
<%
out.println("</tr>");
System.out.println("sessionId"+session1.getId());
}
catch(Exception ex){
ex.printStackTrace();
return;
}
}
%>
</table>
</body>
</html>
注销会话的程序(logout.jsp)
<%@ page language="java" pageEncoding="GB2312"%>
<!DOCTYPE HTML PUBLIC"-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>会话控制</title>
</head>
<body bgcolor="#FFFFFF">
<%
if(session.isNew()!=true){
session.invalidate();
}
response.sendRedirect("index.jsp");
%>
</body>
</html>
如果单击“销毁”,则可以强制将会话信息移除如下
<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="com.test.ch9.*, java.util.*"%>
<!DOCTYPE HTML PUBLIC"-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>LL JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
//关闭会话,释放资源
try{
String strSid=request.getParameter("sessionid");
HttpSession session1=SessionListener.getSession(strSid);
if(session!=null){
session1.invalidate();
}
}
catch(Exception e){
e.printStackTrace();
}
response.sendRedirect("session.jsp");
%>
</body>
</html>
最后将监听器部署到web.xml中去。如下
<web-app>
<listener>
<listener-class>com.test.ch9.SessionListener</listener-class>
</listener>
</web-app>