JSP--监听HTTP会话
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>
<td><a href="logout.jsp">注销</a></td>
</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
JSP--监听HTTP会话的更多相关文章
- JavaWeb监听器的使用(一)监听上下文和会话信息
1.监听上下文的类 package com.examp.ch9; import java.io.FileOutputStream; import java.io.PrintWriter; import ...
- HeadFirst Jsp 05 (属性和监听)
活用DD, 比如, 我想设置一个email地址, 但是不像在servlet中硬编码, 如果能再web.xml中设置一个参数, 直接拿到这个参数就更好一点. 容器建立一个servlet时, 它会读DD( ...
- XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制
连接之后,拿到了connection,通过它可以搞定会话 建立一个会话 MessageListener msgListener = new MessageListener() { public voi ...
- (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案
最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资 ...
- jsp&servlet——session监听
session监听,需要实现HttpSessionAttributeListener接口 attributeAdded:监听添加session attributeRemoved:监听删除session ...
- 【Java EE 学习 21 上】【其它类型的监听器】【使用HttpSessionActivationListener监听session的活化和钝化】
一.ServletContextListener Method Summary void contextDestroyed(ServletContextEvent sce) R ...
- HttpSessionListener和HttpSessionBindingListener监听session的销毁
1. 使用HttpSessionListener public class OnlineUserListener implements HttpSessionListener { public voi ...
- java web session监听销毁跳转
1.了解如何使用HttpSessionListener监听session的销毁. 2.了解如何使用HttpSessionBindingListener监听session的销毁. 一. 使用HttpSe ...
- Servlet的监听
Servlet监听 在<Servlet和Jsp>中我们使用了ServletConfig获取Servlet的初始配置,用ServletContext来获取整个Web应用的初始配置,但如果需要 ...
随机推荐
- Linux中的三个特殊文件
stdin: 0 标准输入 stdout: 1 标准输出 stderr : 2 标准错误输出 /dev/null 表示一个只写文件.所有写入到这个文件的信息都会丢失
- python字典中的元素类型
python字典默认的是string item={"browser " : 'webdriver.irefox()', 'url' : 'http://xxx.com'} 如果这样 ...
- .NET 里 静态方法的并发处理
静态方法在程序运行时 就已经实例化好了 不管多少用户并发 都一样处理,不需要排队等待,实例代码: namespace DotNet.Example { using DotNet.BaseManager ...
- Install Oracle Java JDK/JRE 7u55 on Fedora 20/19, CentOS/RHEL 6.5/5.10
What’s new in Sun/Oracle Java 7 VM Compressed 64-bit object pointers Garbage-First GC (G1) JSR 292: ...
- ZOJ 1188 DNA Sorting
原题链接 题目大意:给定一串字符串,查找字符串里字母逆序排列的对数,按照由少到多的顺序把所有字符串进行排列. 解法:用C++字符串string类的iterator,从每个字符串的起始开始,查找逆序字符 ...
- ZOJ 1178 Booklet Printing
原题链接 题目大意:书本印刷都是用大开的纸张对折.比如一个册子一共4页,为了方便装订,外侧印刷1.4页,内侧印刷2.3页,这样对折之后就可以按照正常阅读习惯翻页了.此题目的就是给出书的总页数,要求计算 ...
- css透明度的设置 (兼容所有浏览器)
一句话搞定透明背景! .transparent_class { filter:alpha(opacity=); -moz-opacity:0.5; -khtml-opacity: 0.5; opaci ...
- Codeforces Testing Round #8 B. Sheldon and Ice Pieces 水题
题目链接:http://codeforces.com/problemset/problem/328/B 水题~ #include <cstdio> #include <cstdlib ...
- PHP部分---字符串处理(文中例子不断更新);
字符串处理: 1.去除 ltrim(),rtrim()函数 trim()函数 trim(字符串名)函数:--去掉字符串两边的空格 ltrim(字符串名,“特殊字符”);--去除字符串左边的空格和 ...
- php部分(查看文件、建立站点、语法变量、变量的几个方法、“全局局部变量的调用”、static、函数参数的作用域);
浏览器查看php文件: 建立站点,浏览php文件: php的语法 <?php echo "Hello World!"; ?> 注释语法: <?php // 这是 ...