- 浏览: 151729 次
- 性别:
- 来自: 武汉
最新评论
-
damoqiongqiu:
为神马文档没有离线下载的,求离线的文档,求楼主赐文档:2534 ...
AsWing 入门 -
afeng119:
谢谢,试试好用不!
struts的html:file标签上传文件,中文的文件名会导致乱码问题 -
wenjinglian:
那去用用
JAVA MYSQL做分页 -
zltian:
AsWing 入门 -
毛冬:
呵呵。就是說LIST是對象引用,而不是值引用
JAVA LIST MAP 是引用地址而不是复制
前言
作为J2EE的重要组成部分的jsp和servlet规范中,会话(session)处理占有非常重要的位置。目前,很多资料都非常详细的讲解了会话跟踪如何处理。但是,针对会话控制却很少有人涉及,原本在servlet规范中,servlet提供了HttpSessionContext接口处理会话控制功能,但是,在Servlet API 2.1以后,这个功能被取消了,参考原文(As of Java(tm) Servlet API 2.1 for security reasons, with no replacement. This interface will be removed in a future version of this API.)。
在本文中,作者会给你介绍一种会话控制的方法,采用listener技术,实现HttpSessionContext的功能替换。很多开发人员都会在部分场合方便得使用到这个功能完成某些任务,例如:在线人员信息查看,在线人员控制等等功能。
分析
本文采用实例方式介绍会话控制功能。使用若干jsp页面,和一个java类完成整个功能演示。详见下表:
组件
功能
Com.guipei.listener. SessionListener
监听组件,完成HttpSessionContext的功能
index.jsp
实现用户登陆,创建新的session
logout.jsp
实现用户退出,用户自动删除session
display.jsp
显示用户登陆信息,在用户登陆后自动转入
session.jsp
列出当前所有的session
kill.jsp
杀掉指定的会话,使这个用户连接无效
实现
监听类com.guipei.listener.SessionListener 实现web application的监听功能,它实现了HttpSessionListener接口,可以监听sessionCreated(HttpSessionEvent se)和sessionDestroyed(HttpSessionEvent se) 方法,因此我们可以很容易的在session的创建和销毁事件过程中处理session的控制。
在此类中,我们创建一个静态实例变量Hashtable ht,采用Hashtable的一个好处是它是线程安全的集合类,无须我们再多做线程处理。采用这个collection类保存我们所要控制的session对象。在监听事件中容易的处理相关任务。
参看全部代码:
package com.guipei.listener;
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();
}
static public HttpSession getSession(String sessionId){
return (HttpSession)ht.get(sessionId);
}
}
页面index.jsp 处理用户登陆,创建新的会话的功能。在完成验证后,跳转到display.jsp页面上。
<%@ page contentType="text/html; charset=gb2312" %>
<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->
<%
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");
// add session
session.setAttribute("name",strName);
session.setAttribute("thing",strThing);
response.sendRedirect("display.jsp");
} catch (Exception e) {
}
%>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<center>Welcome</center>
<form method='post' >
<table align='center'>
<tr>
<td>name:</td>
<td> <input name='name' type='input'/> </td>
</tr>
<tr>
<td>thing:</td>
<td> <input name='thing' type='input'/> </td>
</tr>
<tr>
<td align='right'> </td>
<td align='right'>
<button type='submit'>submit</button>
<button type='reset'>reset</button>
</td>
</tr>
</table>
</form>
</body>
</html>
页面display.jsp用于用户登陆后的显示功能,如果用户没有进行过登陆请求,会自动转发到index.jsp页面,保证用户登陆。
<%@ page language="java" pageEncoding="GB2312" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</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() );
%>
</body>
</html>
页面logout.jsp用于用户退出登陆,采用主动方式销毁session。
<%@ page language="java" pageEncoding="GB2312" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
if(session.isNew()!=true){
session.invalidate();
}
response.sendRedirect("index.jsp");
%>
</body>
</html>
页面session.jsp列出当前会话用户,并提供一个连接到kill.jsp,可以用作销毁指定的会话操作。
<%@ page language="java" pageEncoding="GB2312" %>
<%@ page import= 'com.guipei.listener.*,java.util.*'%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
List session object
<br>
<table border='1'>
<tr bgcolor='yellow'>
<td>session id</td>
<td>user name </td>
<td>what thing </td>
<td>create time </td>
<td>operate</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>" );
out.println("<td> <a href='kill.jsp?sessionid=" + session1.getId() +
"'>kill </a> </td>" );
out.println("</tr>");
System.out.println("list " + session1.getId());
}catch(Exception ex){
ex.printStackTrace();
return;
}
}
%>
</table>
</body>
</html>
页面kill.jsp实现销毁指定会话的功能,接收一个session id参数,从我们保存的session对象集合中取得对应的session对象,调用invalidate方法,销毁对象。
<%@ page language="java" pageEncoding="GB2312" %>
<%@ page import="com.guipei.listener.*"%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
// kill the session
try {
String strSid = request.getParameter("sessionid");
HttpSession session1 = SessionListener.getSession(strSid);
if (session1!=null){
session1.invalidate();
}
} catch (Exception e) {
e.printStackTrace();
}
response.sendRedirect("session.jsp");
%>
</body>
</html>
完成以上代码后,还需要在web.xml描述中添加以下元素。使得SessionListener类可以发挥监听功能。
<listener>
<listener-class>
com.guipei.listener.SessionListener
</listener-class>
</listener>
总结
作者不是很清楚,servlet规范为什么要取消HttpSessionContext接口,尽管它声明了取消的原因,但是我们仍然可以容易的通过HttpSessionListener接口实现这个功能。
发表评论
-
动易标签大全
2009-06-24 13:08 2750网站通用标签适用于整 ... -
JAVA LIST MAP 是引用地址而不是复制
2009-03-10 10:36 4030StringBuffer aa=new StringBuffe ... -
JAVA 自定义标签 简介
2009-01-20 16:19 2368Test.jsp <!DOCTYPE HTML P ... -
无级栏目
2009-01-07 17:32 1292很早以前写的东西 这2天要用找了我10几分中 放上来做个笔记 ... -
excel导出文件
2009-01-06 15:48 1648// 创建一个新的excel文件,并将数据导入进去 publ ... -
图片光标定位
2008-12-24 17:25 1599<form action="2.jsp ... -
JAVA导出EXCEL
2008-12-19 10:29 3325Vector vector=listSparepart(con ... -
JAVA 读写文件
2008-11-14 09:44 1586public static void main(String ... -
img图片没找到onerror事件
2008-11-12 15:50 2941<script type="text/java ... -
HTMLArea onsubmit 提交验证问题
2008-10-31 11:21 1461在JSP中用上了HTMLArea后发现里边有个ONSUBMIT ... -
radio JS验证
2008-10-29 17:03 1498function checked(){ var isJu ... -
JAVA读文件夹
2008-10-28 09:05 2392public static boolean readfi ... -
java md5类
2008-10-16 16:00 3734public static String getMD5(byt ... -
DWR写个3级联动
2008-09-18 10:08 1554我原先写过1个拿prototype.js写过1个 可惜和htm ... -
添加时间的JS
2008-09-11 11:28 1066他同学小小那边有份 可惜他那个我用的时候JS 总在暴错 以前我 ... -
总结:子窗口创建及父窗口与子窗口之间通信
2008-09-05 16:46 35291、Javascript弹出子窗口 可以通过多种方式实现,下面 ... -
反射写SQL语句
2008-08-26 15:54 1019// 改 // public void update(Obj ... -
JAVA mysql插入时间
2008-08-21 10:18 3607MYSQL为DATATIME型的时候 pstmt.setTim ... -
java mysql批量导入优化
2008-08-08 09:18 2472Connection conn=dao.getConn(); ... -
JAVA读Excel
2008-07-22 09:36 0public static void main(String ...
相关推荐
实现用户在一定时间内自动登录的关键在于,浏览器关闭后再打开时能够重新发送上一次的Session ID。这通常依赖于浏览器对Cookie的处理: 1. **持久化Cookie**:为了让浏览器在关闭后仍能记住Cookie,我们可以设置...
6. 取得用户最后一次操作的时间: 方法:`public long getLastAccessedTime()`, 用户在线时间 = Session 最后一次操作时间 - Session 创建时间。 Session 与 Cookie 的区别 Session 将信息保存在服务器上,而 ...
"szsessdifn"可能是某种特定的Session变量名或函数,但在这里没有足够的上下文来详细解释。 当用户首次访问网站时,服务器会为该用户创建一个唯一的Session ID,并将其存储在服务器的内存中。这个ID随后通过Cookie...
Session是一种用于维护客户端与服务器之间交互状态的技术,它能够跟踪用户的活动并保存用户数据,从而使得网站能够在多次请求之间保持一致的状态。下面将详细介绍Session的相关知识点。 #### 一、Session概念 1. *...
正对java Web项目,同浏览器同时打开两个登录窗口(不同Tag),用不同用户登录,为避免使用同一个Session,需要使用这段代码。否则先登录的用户的Session会变成后登录用户的Session.相关系统使用权限也会变。
客户端每次请求时都会带上这个 session ID,服务器据此判断用户是否已登录。基于令牌的验证则更适用于无状态的 API,如 JWT(JSON Web Tokens),用户登录后获取一个令牌,之后的每次请求都将令牌附在请求头中。 ...
每个用户访问网站时,服务器都会为该用户创建一个唯一的会话标识(session ID),通过这个标识可以在多次请求之间共享数据。系统session和报表session是两个独立的概念,它们在Web服务器下共存时,不会发生冲突,...
在两次访问之间保持一个cookie 上下文 就可以保持一个session 所以你需要把前一次返回的结果的http头中 cookie 的所有内容 作为下一次发送你request http头的cookie内容就可以保持session上下文了
session.setAttribute("result", "太小了,再试一次!"); } else { session.setAttribute("result", "太大了,再试一次!"); } // 更新剩余尝试次数 remainingAttempts--; session.setAttribute(...
为了解决这个问题,Spring Session提供了一种优雅的解决方案,特别是结合Redis作为持久化存储时,可以实现高效的分布式Session管理。本文将详细介绍Spring Session与Redis集成,以及如何自定义Session来应对分布式...
因此,但你刷新上一次的请求时,页面会输出一个名为 JSESSIONID 的 Cookie,后面就是相应的 Cookie 值,也就是本次“会话”的 SessionID,但你再次刷新此页面时会得到相同的输出,因为在一次“会话”中,请求信息...
如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...
session驱动类 session存入数据库 数据库存储session 用于session存入数据库
之后,浏览器在每次发送请求时都会带上这个Session ID,服务器根据ID找到对应的Session数据。 在JavaScript中,直接操作Session的方法是有限的,因为JS无法直接修改服务器端的数据。但有一种常见的方法可以间接实现...
一个服务器上搭建了多个tomcat或者weblogic,端口不一样,同时启动访问时session丢失。如:A,B两个服务,在浏览器中登录访问A后,当前打开的浏览器上在开一个选项卡访问B服务后,回过来点击访问A时session丢失,...
`memcached-session-manager`是Java的一个库,用于在基于Tomcat的Web应用中实现基于Memcached的session共享,这在分布式环境中尤为重要。 标题中的"session共享 memcached-session-manager 1.9.6 jar"指的正是这个...
- **创建**:当用户第一次访问服务器时,如果没有提供有效的 Session ID,则服务器会为该用户创建一个新的 Session,并将 Session ID 存储在 Cookie 中返回给客户端。 - **销毁**:Session 的销毁可以由服务器自动...
使用Redis解决session共享的原理非常简单,就是把原本储存在不同服务器上的session拿出来放到一个独立的服务器上。这样就实现了session共享! Springboot配置session共享 Springboot提供了自动化session共享配置...
Session是一种服务器端的机制,服务器为每个客户端连接创建一个唯一的会话(Session)标识,即sessionid。客户端会通过Set-Cookie头部获得这个sessionid,并将其存储在客户端的Cookie中。此后,客户端对服务器的每次...