ajax和Java session监听

Session监听嘛,没什么好解释的,java提供了很灵活的事件机制来监听session,可以监听session的创建和销毁,监控session 所携带数据的创建、变化和销毁,可以监听session的锐化和钝化(了解对象序列化的兄弟应该知道这个),其他的平台是个什么情况我不太清楚,估计也差不多吧。如果能够对所有客户的session进行监控,就不用再去操作麻烦而危险的Application了。

-----

一、 session监听

  servlet中对session的监听有很多接口,功能很灵活,最常用的是监听Session和Attribute。这里要澄清一下概念,servlet中的session监听和Attribute监听含义有差别,session监听指的不是我们一般所理解的放置一个session或者销毁一个session,这是Attribute监听的功能,因为servlet中放置session的语法是 session.setAttribute("session名",要放入的对象)。而session监听,监听的是HTTP连接,只要有用户与 server连接,就算连接的是一个空白的jsp页面,也会触发session事件,所以此处的session实际上指的是connection,用来统计当前在线用户数最合适了。不知道我说清楚了没有。下面分别讲解这两种监听方式。
  1、 session监听

  首先编写一个session监听类,实作HttpSessionListener接口,它的作用是计算当前有多少个在线用户:


package org.bromon.test;

import javax.servlet.*;
import javax.servlet.http.*;

public class SessionCount implements HttpSessionListener
{
private static int count=0;

public void sessionCreated(HttpSessionEvent se)
{
count++;
System.out.println("session创建:"+new java.util.Date());
}

public void sessionDestroyed(HttpSessionEvent se)
{
count--;
System.out.println("session销毁:"+new java.util.Date());
}

public static int getCount()
{
return(count);
}
}


  怎么样,是不是一目了然?count被定义为static,是因为要保证整个系统只有这一个count。如果你实在不放心,可以把它写成一个单例类。

  然后在web.xml中声明这个监听器:

<listener>
<listener-class>
org.bromon.test.SessionCount
</listener-class>
</listener>


  编写一个测试页面test.jsp,内容是获得count:

<%
int count=org.bromon.test.SessionCount.getCount();
out.println(count);
%>


  需要注意的是,这里根本不涉及任何session的操作。重启动App server,试着连接test.jsp,可以看到监听器已经开始工作。
 2、 Attribute监听


  作为一个站内消息系统,肯定要获得所有登陆者的ID,才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块,用户通过身份验证之后会产生一个session,保存它的相关信息,比如:


//check.jsp
<%
String name=request.getParameter("name");
Name=new String(name.getBytes("ISO8859-1"));
session.setAttribute("user",name);
%>


  做过jsp的兄弟应该对这段代码再熟悉不过了,下面写个监听器来监听用户登陆,把所有用户的ID保存到一个List当中,这个监听器实作HttpSessionAttributeListener接口:


package org.bromon.test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class OnlineList implements HttpSessionAttributeListener
{
private static List list=new ArrayList();

public void attributeAdded(HttpSessionBindingEvent se)

{
if("user".equals(se.getName()))
{
list.add(se.getValue());
}
}

public void attributeRemoved(HttpSessionBindingEvent se)
{
if("user".equals(se.getName()))
{
list.remove(se.getValue());
}
}

public void attributeReplaced(HttpSessionBindingEvent se){}

public static List getList()
{
return(list);
}
}


  写个简单的jsp来得到用户列表:


&ly;%
java.util.List list=org.bromon.test.OnlineList.getList();
out.println("共有"+list.size()+"名用户已登陆:");
for(int I=0;I<lise.size();i++)
{
out.println(list.get(i));
}
%>


  也许你说,这有什么神奇呢,监听session而已,不着急,看看xmlhttp。
二、 XMLHTTP

  XMLHTTP的用处很多,这里只说我们需要的,就是无刷新的与server通信,看这段代码:


<script language="javascript">
xml = new ActiveXObject("Microsoft.XMLHTTP");
var post=" ";//构造要携带的数据
xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打开一个到服务器的连接,以异步方式通信
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//发送数据
var res = xml.responseText;//接收服务器返回的数据
document.write(res);
</script>


  豁然开朗,这段代码就是打开一个HTTP连接,以标准的HTTP格式传递数据,如果你喜欢,可以用XML的格式来传递。更改一下xml 对象的构造方式就可以兼容Mozilla和Netscape。下面来写一个轮询,每隔一段时间刷新一次用户列表,当然,是不需要刷新页面的:


<html>
<head><title>探测器</title>
<script language="javascript">
function detect()
{
xml = new ActiveXObject("Microsoft.XMLHTTP");
var post=" ";//构造要携带的数据
xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打开一个到服务器的连接,以异步方式通信
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//发送数据
var res = xml.responseText;//接收服务器返回的数据
list.innerText=res;
setTimeout("detect()",5000);//每隔5秒钟轮询一次
}
</script>
<body οnlοad="detect()">
<a id="list"></a>
</body>
</html>


  这样的通信方式数据量很小,不用重新传递整个页面,5秒钟轮一次,普通PC也能承受较大的在线数。构造一个探测器来监听在线列表和消息,效果是很好的,即使你的客户坐在电脑前袖手旁观,键鼠都不碰一下,也能保证数据即时传递,页面也不会发生跳转和刷新。

  Session监听加上XMLHTTP通信

转载于:https://www.cnblogs.com/backuper/archive/2008/10/10/1307801.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机历年考研复试上机基础题(一)

abc 题目描述 设a、b、c均是0到9之间的数字&#xff0c;abc、bcc是两个三位数&#xff0c;且有&#xff1a;abcbcc532。求满足条件的所有a、b、c的值。输入描述: 题目没有任何输入。 输出描述: 请输出所有满足题目条件的a、b、c的值。 a、b、c之间用空格隔开。 每个输出占一行。…

CSS选择器的权重与优先规则

2019独角兽企业重金招聘Python工程师标准>>> 我们在使用CSS对网页元素定义样式时经常会遇到这种情况&#xff1a;要对一般元素应用一般样式&#xff0c;然后在更特殊的元素上覆盖它们。那么我们怎么样来保证我们所新定义的元素样式能覆盖目标元素上原有的样式呢&…

《代码之美》第六章:菜鸟的自圆其说

Micheal Feather是我早就攻击过的专家级菜鸟&#xff0c;看过这一章&#xff0c;他在我心目中的高级初学者的形象&#xff0c;已经板上钉钉了。前两天看一本书&#xff0c;讲到调研表明&#xff0c;很多人在自己的领域干了20年&#xff0c;过了前五年&#xff0c;基本就不会再获…

java返回两个string_java – 为什么String.intern()方法返回两个不同的结果?

我有这样的代码&#xff1a;public static void main(String[] args) {String str1 new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern()str1);String str2 new StringBuilder("ja").append("va&qu…

列表和range、元组

1、listt.append&#xff08;&#xff09;默认追加在后面 2、list.insert&#xff08;索引&#xff0c;“元素”&#xff09;按索引添加 3、list.extend&#xff08;&#xff09;可添加多个字或字母的字符串&#xff0c;也可以是列表 4、list.pop&#xff08;&#xff09;默认删…

gridview添加header

gridview是不能添加header的&#xff0c;这里的解决方法是将listview改造成gridview使用&#xff0c;功能很好用&#xff0c;唯一的缺点是列数不能自适应 示例代码下载地址http://pan.baidu.com/s/1bnmyVZT 该项目是在国外博客看到的&#xff0c;连接 http://www.plattysoft.co…

RedHat下JDK1.6安装-利用alternative实现多版本并存(Ubuntu同理)

虽然本文讲的是RH下面的配置&#xff0c;不过Ubuntu里也是一样的&#xff01; RedHat es下安装过程很简单&#xff0c;Sun下载JDK1.6包&#xff0c;解压&#xff0c;然后rpm安装 安装完后&#xff0c;在etc/profile.d/下建立java.sh&#xff0c;代码如下 JAVA_HOME/usr/java/jd…

java如何添加同名的xml节点_jaxb怎么解析多个同名元素

说明&#xff1a; xml是调用外部系统返回的&#xff0c; 收费服务&#xff0c; 格式无法更改XML格式....................................java 大概格式XmlRootElement(name "INFO")public class OrderResponse {private Status status;private List orderList;pub…

web.xml

1、web.xml学名叫部署描述符文件&#xff0c;是在Servlet规范中定义的&#xff0c;是web应用的配置文件。 2、部署描述符文件就像所有XML文件一样&#xff0c;必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。DOCYTPE声明必须立即出现在此头之后。这个…

Scheme N皇后

(define (range n)(define (recur n)(if ( n -1)()(cons n (recur (- n 1)))))(recur (- n 1)))(define (flatten a)(if (null? a)()(append (car a) (flatten (cdr a)))))(define (safe? x y sln)(if (null? sln)#t(let ((px (car (car sln))) (py (cadr (car sln))))(if (…

python全栈开发学习_day1_计算机五大组成部分及操作系统

一.计算机五大组成部分&#xff1a; 1&#xff09;五大组成&#xff1a; 1.控制器&#xff08;指挥系统&#xff0c;用于控制其他计算机硬件的工作&#xff09; 2.运算器&#xff08;用于数学运算及逻辑运算&#xff09; 3.存储器&#xff08;寄存器&#xff0c;高速缓存&#…

Asp.net如何截屏

在C#案例开发这本书中提到了一个方法 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Imaging; namespace zhua2 { /// <summary> /// Form1 的摘要…

php bloginfo stylesheeturl,WordPress主题制作–bloginfo函数使用教程

最近在做一款WordPress的主题&#xff0c;由于对PHP知之甚少&#xff0c;所以在制作过程中&#xff0c;还是费了很大劲儿的&#xff0c;现在就把在制作过程中遇到的一些问题逐一分享出来。开篇第一讲&#xff0c;我要分享的是bloginfo函数。这个函数主要是获取站点的相关信息&a…

201671030130+词频统计软件项目报告

&#xff08;一&#xff09;需求分析 根据实验二 软件工程个人项目的要求该软件项目的基本功能要求如下&#xff1a; 1.程序可读入任意英文文本文件&#xff0c;该文件中英文词数大于等于1个。 2.程序需要很壮健&#xff0c;能读取容纳英文原版《哈利波特》10万词以上的文章。 …

php系统维护,软件系统维护主要包含什么

软件系统维护主要包含软件系统正常使用要求与定期维护、软件系统初始化安装的维护准备。软件是用户与硬件之间的接口界面&#xff0c;用户主要是通过软件与计算机进行交流。本文操作环境&#xff1a;windows系统、thinkpad t480电脑。(学习视频分享&#xff1a;编程视频)计算机…

一个C#写的调用外部进程类

2008-05-21 07:00 作者&#xff1a; 肖波 出处&#xff1a; 天极网 C# 调用外部进程的类&#xff0c;网上可以搜出很多来&#xff0c;为什么要再写一遍&#xff0c;实在是因为最近从网上拷贝了一个简单的例程用到项目中&#xff0c;运行有问题&#xff0c;后来研究了半天&#…

lamp平台

LANMP平台LAMP指的Linux&#xff08;操作系统&#xff09;、ApacheHTTP 服务器&#xff0c;MySQL&#xff08;有时也指MariaDB&#xff0c;数据库软件&#xff09; 和PHP&#xff08;有时也是指Perl或Python&#xff09; 的第一个字母&#xff0c;一般用来建立web 服务器。lamp…

在预览fastreport报表之前改变一些报表对象的属性

在预览fastreport报表之前改变一些报表对象的属性 有时候许多报表很可能大同小异&#xff0c;只是有个别地方显示的不同&#xff0c;如报表标题&#xff0c;一些控件标题等等。这样我们只需要设计一次报表&#xff0c;在许多地方调用同一份报表&#xff0c;这时候&#xff0c;我…

centos7 配置静态ip时出现双ip问题解决

1、先用ifconfig&#xff0c;看看有几个网卡 2、执行vi /etc/sysconfig/network-scripts/ifcfg-eth0最后的网卡名字改为实际的 3、静态ip只需要设置着几个地方&#xff0c;BOOTPROTOstatic,特别要注意检查是否有NM_CONTROLLEDno&#xff0c;我就是加了这句重启了就没有两个ip了…

晴天php下载,x.php · 一步晴天/smart - Gitee.com

//get拦截规则$getfilter "\\<.>|<.>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]?\)|load_file\s*?\\()|]*?\\…