JSP--监听HTTP会话

来源: <http://www.cnblogs.com/eflylab/archive/2007/01/16/621953.html>

ServletListener 之 监听HTTP会话

在开始先要知道我们可以通过HttpSessionListener接口监听HTTP会话的创建,销毁的信息;通过HTTPSessionActivationListener监听HTTP会话的active,passivate情况;通过HttpSessionBindingListener监听HTTP会话中对象的绑定信息;通过HttpSessionAttributeListener监听HTTP会话中属性的设置情况 。
下面写个具体的例子:

监听HTTP会话程序

监听HTTP会话程序
package eflylab;
import java.util.Hashtable;
import java.util.Iterator;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

//HttpSessionListener接口监听会话的创建,销毁的信息
public class SessionListener implements HttpSessionListener {
    /** *//**
     * 该类实现了HttpSessionListener接口。
     * 该类还有一个属性Hashtable,用来保存所有的登录信息。
     * 当创建一个Session时,就调用 sessionCreate()方法将登录会话保存到Hashtable中;
     * 当销毁一个Session时, 就调用sessionDetoryed()方法将 登录信息从Hashtable中移除
     * 这就就实现了管理在线用户登录的会话信息目的 
     */
    // 集合对象,保存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);
    }
    
}

测试会话监听的程序index.jsp

测试会话监听的程序index.jsp
<%@ 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 align=‘‘center‘‘> 
        <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> 

当访问上面页面时就会出现一个登录框,输入后进入display.jsp显示刚才输入的内容

会话信息显示的程序 display.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.getCreationTime() ); 
%> 
<form >
  <table>
      <tr>
        <td><a href="session.jsp">管理</a></td>&nbsp;&nbsp;&nbsp;&nbsp;
        <td><a href="logout.jsp">注销</a></td>&nbsp;&nbsp;&nbsp;&nbsp;
    </tr>
  </table>
</form>
</body> 
</html> 

单击管理即进入管理页面session.jsp,单击注销就会进入 会话注销页面 logout.jsp使 HTTP会话无效

会话管理程序 session.jsp

会话管理程序 session.jsp
<%@ page language="java" pageEncoding="GB2312" %> 
<%@ page import= "eflylab.*,java.util.*"%> 
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> 
<html> 
<head> 
<title>Lomboz 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(); //获得返回全部session对象集合
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

注销会话的程序 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> 

制移除会话的程序 end.jsp

强制移除会话的程序 end.jsp
<%@ page language="java" pageEncoding="GB2312" %> 
<%@ page import="eflylab.*"%> 
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> 
<html> 
<head> 
<title>Lomboz JSP</title> 
</head> 
<body bgcolor="#FFFFFF"> 
<% 
// 关闭会话,释放资源
try { 
    String strSid = request.getParameter("sessionid"); 
    HttpSession session1 = SessionListener.getSession(strSid); //根据ID获取 Session
    if (session1!=null){ 
        session1.invalidate(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 

response.sendRedirect("session.jsp"); 
%> 
</body> 
</html> 

部署文件 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<listener>
    <listener-class>eflylab.SessionListener</listener-class>
</listener>
</web-app>

对请求的监听
在Servlet2.4规范中,新加了一个技术,就是可以监听客户端的请求。一旦能够在监听程序中获取客户端的请求,就可以对请求进行统一处理。比如做一个WEB管理程序,如果在梧桐访问,就可以不登录,如果是远程访问,那么就需要登录。这样我们就可以 监听客户端的请求,从请求中获得客户端地址,并通过这个地址做出对应的处理。
我们在上面例子的基础上再扩展一下!

package eflylab;

import javax.servlet.*;

public class MyRequestListener 
implements ServletRequestListener,ServletRequestAttributeListener
{
    //ServletRequestListener
    public void requestDestroyed(ServletRequestEvent sre) 
    {
        logout("request destroyed");
    }
    
    public void requestInitialized(ServletRequestEvent sre) 
    {
        //在这个方法里,获得客户端请求对象,然后通过这个请求对象获得访问
        //的客户端IP地址。如果该地址是“127”开的,那么就认为它是从本机访问
        //就在请求中设置一个isLogin的属性,并且这个属性的值为Boolean(true)
        //对象,如果不是从本机访问,那么就必须把这个属性设置成Boolean(false)对象
        
        logout("request init");//日志
        ServletRequest sr=sre.getServletRequest();
          
        if(sr.getRemoteAddr().startsWith("127"))
            sr.setAttribute("isLogin",new Boolean(true));
        else 
            sr.setAttribute("isLogin",new Boolean(false));
        
        
    }//ServletRequestListener
    
    //ServletRequestAttributeListener
    public void attributeAdded(ServletRequestAttributeEvent event) 
    {
        logout("attributeAdded(‘" + event.getName() + "‘, ‘" +
        event.getValue() + "‘)");
    }
    public void attributeRemoved(ServletRequestAttributeEvent event) 
    {
        logout("attributeRemoved(‘" + event.getName() + "‘, ‘" +
        event.getValue() + "‘)");

    }
    
    public void attributeReplaced(ServletRequestAttributeEvent event)
    {
        logout("attributeReplaced(‘" + event.getName() + "‘, ‘" +
        event.getValue() + "‘)");
        
    }//ServletRequestAttributeListener
    private void logout(String msg)
    {
        java.io.PrintWriter out=null;
        try
        {
            out=new java.io.PrintWriter(new java.io.FileOutputStream("c:\\request.txt",true));
            out.println(msg);
            out.close();
         }
         catch(Exception e)
         {
             out.close();
         }          
    }    
}
    

在MyRequestListener中,实现了对客户端请求和请求中参数设置的监听。要实现这二个监听功能,需要实现ServletRequestListener和ServletRequestAttributeListener接口 。
如果在本机访问 ,
则直接调用http://127.0.0.1:8088/test/display.jsp页面,如果在另外机子上访问,则出现登录界面 index.jsp

---------------------------------------------------------------------------------------------

来自为知笔记(Wiz)

JSP--监听HTTP会话

时间: 2024-08-30 01:05:19

JSP--监听HTTP会话的相关文章

WPF监听Windows会话

当一个用户关闭Windows或者机器的时候,WPF可以监听到其事件并可以发出警告.事件名称为Application.SessionEnding,在用户注销和关机时触发. 通过设置SessionEndingCancelEventArgs.Cancel 为true,可以阻止其注销/关机行为: 1 private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) 2 { 3 MessageBoxR

《Head First Servlets & JSP》-5-属性和监听

Servlet初始化参数 在DD文件(web.xml)中 Servlet参数在 在Servlet代码中 在Servlet初始化之前不能使用Servlet初始化参数 一旦有了一个ServletConfig引用,就可以调用getInitParameter()方法,不过 不能从构造函数调用这个方法!因为容器只调用构造函数还未调用init()之前,它还不算一个完整的Servlet(薛定谔Servlet). Servlet初始化参数只能赌一次--就是在容器初始化Servlet的时候 容器建立一个Servl

监听短信增删以及短信会话增删

网上找了许久,才找到会话增删监听的uri与短信不一样,如下: resolver.registerContentObserver(Uri.parse("content://sms"), true, observer); resolver.registerContentObserver(Uri.parse("content://mms-sms"), true, observer);

(转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资料,都没有一个好的解决方案,顺便吐糟一下:大家来eoe发问题,问题解决了,也不说把解决的方法给大家分享一下... OK,先看源码吧com.android.providers.telephony.MmsSmsProvider这个类的删除操作源码 @Override    public int dele

oracle配置监听图形界面不出来解决方法

ROOT用户下,执行 xhost +   然后再切换到oracle用户运行netca DISPLAY 在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0使用xdpyin

oracle监听(lsnrctl)详解解读

(总结)Oracle监听服务lsnrctl参数及查询状态详解 lsnrctl命令常用参数详解: lsnrctlstart启动指定的监听器 stop关闭指定的监听器 status显示监听器的状态.status命令显示监听器是不是活动的,日志与跟踪文件的位置,监听器已经持续运行了多长时间,以及监听器所监听的任务.如下图所示: services列举监听器的服务信息,比如这些服务是否有任何专用的预生成服务器进程或与之相关的调度进程,以及每个服务已有多少连接被接受或拒绝.这种方法用来检查一个监听器是否在监

LINUX下安装Oracle后无法建监听

***********************************************声明**********************************************  原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 表述有错误之处,请您留言或邮件([email protected])指明,不胜感激. 本文转载必须保留此处:http://blog.csdn.net/huangyanlong/article/det

windows系统端口监听

通常情况下,如果想发现所有已经使用的和正在监听的端口,我们可以使用netstat命令. netstat并非一个端口扫描工具,如果你想扫描计算机开放了哪些端口的话,建议使用本文介绍的方法. Netstat命令基础 Netstat命令主要用于显示协议统计信息和当前 TCP/IP 网络连接. 其格式如下: NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] [-r] [-s] [-v] [interval] 下面简单说明各个参数的含义: -a 显示所有连接和监听端口

观察者模式实际应用:监听线程,意外退出线程后自动重启

摘要: 观察者模式,定义对象之间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新.观察者模式在JDK中有现成的实现,java.util.Obserable. 首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名.(这个是原先已经实现了的功能,请看我的一篇文章java利用WatchService实时监控某个目录下的文件变化并