- 浏览: 152814 次
- 性别:
- 来自: 武汉
-
最新评论
-
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 2768网站通用标签适用于整 ... -
JAVA LIST MAP 是引用地址而不是复制
2009-03-10 10:36 4046StringBuffer aa=new StringBuffe ... -
JAVA 自定义标签 简介
2009-01-20 16:19 2377Test.jsp <!DOCTYPE HTML P ... -
无级栏目
2009-01-07 17:32 1300很早以前写的东西 这2天要用找了我10几分中 放上来做个笔记 ... -
excel导出文件
2009-01-06 15:48 1666// 创建一个新的excel文件,并将数据导入进去 publ ... -
图片光标定位
2008-12-24 17:25 1610<form action="2.jsp ... -
JAVA导出EXCEL
2008-12-19 10:29 3343Vector vector=listSparepart(con ... -
JAVA 读写文件
2008-11-14 09:44 1602public static void main(String ... -
img图片没找到onerror事件
2008-11-12 15:50 2955<script type="text/java ... -
HTMLArea onsubmit 提交验证问题
2008-10-31 11:21 1477在JSP中用上了HTMLArea后发现里边有个ONSUBMIT ... -
radio JS验证
2008-10-29 17:03 1518function checked(){ var isJu ... -
JAVA读文件夹
2008-10-28 09:05 2419public static boolean readfi ... -
java md5类
2008-10-16 16:00 3749public static String getMD5(byt ... -
DWR写个3级联动
2008-09-18 10:08 1566我原先写过1个拿prototype.js写过1个 可惜和htm ... -
添加时间的JS
2008-09-11 11:28 1077他同学小小那边有份 可惜他那个我用的时候JS 总在暴错 以前我 ... -
总结:子窗口创建及父窗口与子窗口之间通信
2008-09-05 16:46 35401、Javascript弹出子窗口 可以通过多种方式实现,下面 ... -
反射写SQL语句
2008-08-26 15:54 1025// 改 // public void update(Obj ... -
JAVA mysql插入时间
2008-08-21 10:18 3616MYSQL为DATATIME型的时候 pstmt.setTim ... -
java mysql批量导入优化
2008-08-08 09:18 2484Connection conn=dao.getConn(); ... -
JAVA读Excel
2008-07-22 09:36 0public static void main(String ...
相关推荐
longpolling_room ...signin.php 使用者第一次需要先登入(只要求输入姓名) 资料库架构介绍 本系统的资料库架构十分简易,资料表与栏位如下 Schema 介绍 user (uid,name) 储存使用者基本资料 msg (id,content,se
独子棋demo.rar
云安全联盟软件定义边界SDP标准规范2.0202239页.pdf
Uniapp开发的微商个人相册多端小程序源码。使用 HBuilder X 导入本地项目,修改小程序AppID,以及Uni-app应用标识,调试发布即可。 小程序源码特点: 1、首页进行相册展示,采用分页 2、列表页面以文字形式进行分类,管理员可进行添加,修改和排序 3、每个列表下有多个相册,管理员可进行添加,修改和排序 4、每个相册有多张图片,有小图和大图模式进行切换 5、相册中可以长按图片进行选择删除和设为封面 6、相册可以进行分享 7、我的页面有管理员登录,联系客服等功能
内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
地级市政府通过制定相关政策来推动数字经济的发展和数字政府的建设。这些政策可能包括鼓励企业数字化转型、促进数字技术创新、加强数字基础设施建设、优化数字政务服务等方面的内容。政策制定的频率和力度,可以在一定程度上反映政府对数字领域的关注度。 在地级市政府数字关注度的背景下,词频分析成为了一种有效的工具,用以衡量政府文件和宣传资料中涉及数字技术和数字化转型相关词汇的频次,进而揭示政府对这一领域的关注程度和重视方向。 数据名称:地级市-政府数字关注度、词频
内容概要:本文详细探讨了在Android平台上进行图像模板匹配的技术挑战和解决方案,特别是在处理不同尺寸和旋转角度的目标物时的方法。文中介绍了使用OpenCV构建图像金字塔、处理旋转模板以及利用NEON指令集优化性能的具体实现。此外,文章还讨论了在armeabi-v7a和arm64-v8a这两种主要ARM架构下的优化技巧,如内存对齐、SIMD指令优化、RenderScript并行处理等。作者分享了许多实践经验,包括如何避免常见的性能瓶颈和兼容性问题。 适合人群:有一定Android开发经验,尤其是熟悉OpenCV和NDK编程的中级及以上开发者。 使用场景及目标:适用于需要在移动设备上进行高效图像识别的应用开发,如实时视频流中的物体检测、游戏内的道具识别等。目标是提高模板匹配的速度和准确性,同时确保在不同硬件配置下的稳定性和兼容性。 其他说明:文章提供了丰富的代码片段和实际案例,帮助读者更好地理解和应用所介绍的技术。特别强调了在不同ARM架构下的优化策略,为开发者提供了宝贵的参考资料。
内容概要:本文探讨了一种改进的粒子群优化(PSO)算法在微电网多目标优化调度中的应用。传统PSO在解决此类复杂问题时常陷入局部最优解,而改进版通过引入动态惯性因子和自适应变异操作,显著提升了算法性能。文中详细介绍了这两种改进措施的具体实现方法及其对算法收敛性和解质量的影响。此外,还展示了该算法在实际微电网调度任务中的表现,特别是在权衡经济成本与环境效益方面的能力。 适合人群:从事电力系统优化、智能电网研究的专业人士以及对进化算法感兴趣的学者和技术人员。 使用场景及目标:适用于需要进行高效能源管理的场合,如分布式发电系统的规划与运行。主要目的是寻找既能降低成本又能减少环境污染的最佳调度方案。 其他说明:文中提供了大量伪代码片段帮助读者理解具体的技术细节,并强调了参数调节对于最终结果的重要性。同时指出,该方法不仅限于微电网领域,还可以扩展应用于其他类型的优化问题。
Delphi 12.3控件之TeeChart Offline Keygen.7z
内容概要:本文详细介绍了如何利用MATLAB进行屈光度计算及其数据处理方法。首先解释了屈光度的基本概念和计算公式,接着展示了如何通过MATLAB代码读取、清理和转换焦距数据为屈光度,并进行了必要的单位转换。针对可能出现的异常值和噪声,文中提供了有效的数据清洗手段。此外,还探讨了如何对屈光度数据进行统计分析以及可视化呈现,如绘制趋势图和散点图等。最后,提到了将MATLAB代码转化为C++代码以便集成到硬件系统的高级应用。 适合人群:从事光学研究、眼科医疗设备开发的技术人员,以及对MATLAB有兴趣的学习者。 使用场景及目标:适用于需要精确处理和分析光学数据的研究机构或企业,旨在提高屈光度计算的效率和准确性,确保数据质量的同时优化实验结果。 其他说明:文中不仅涵盖了基本的操作步骤,还包括了许多实用的小贴士和技术细节,有助于读者更好地理解和掌握相关内容。同时强调了单位一致性的重要性,提醒开发者注意潜在的问题。
349421c2-4955-4132-b4da-808a3a171bfe.pdf
1744300906657718_download.jsp
【内容概要】 本文详细解析了企业筛选简历的“三重门”系统,包括ATS系统初筛、HR复核和业务部门终极评估三个阶段。首先,ATS系统作为关键词匹配引擎,强调了关键词的重要性及其优化方法;其次,HR在6秒内通过“薄片判断”评估简历的职业连贯性、成就量化和岗位匹配度;最后,业务部门则侧重于技术能力和文化适配性的综合评估。文章还揭示了各环节中的心理学原理和认知偏差,并提供了针对性的优化建议。 【适合人群】 正在求职或有求职打算的职场人士,尤其是希望提升简历通过率的求职者。 【使用场景及目标】 ①帮助求职者理解企业筛选简历的具体流程; ②提供简历优化的具体方法,如关键词优化、成就量化、案例准备等; ③指导求职者如何根据不同阶段的评审特点调整简历内容。 【其他说明】 文章结合了最新的招聘趋势研究报告和心理学理论,强调简历不仅是通过筛选的工具,更是展示个人能力和价值的平台。求职者应充分利用这些心理规律,打造更具吸引力的简历,为后续面试做好铺垫。
内容概要:本文详细介绍了使用PFC2D5.0进行二维岩石单轴压缩模拟的具体方法和代码实现。首先,通过设定模型的基本参数如颗粒生成、粘结设置、加载控制等,构建了一个完整的岩石样品模型。接着,深入探讨了加载过程中应力应变曲线的变化规律以及能量分析的方法,包括弹性应变能、动能和耗散能的监测。此外,还提供了裂隙统计的技术手段,能够精确捕捉岩石内部裂隙的发展情况。最后,强调了参数调整对模拟效果的影响,并给出了优化建议。 适合人群:从事岩土工程、地质力学研究的专业人士和技术爱好者。 使用场景及目标:适用于需要深入了解岩石力学特性的研究人员,帮助他们掌握PFC2D软件的应用技巧,提升科研能力。同时,也为相关领域的学生提供了一套实用的学习资料。 其他说明:文中提供的代码可以直接应用于PFC2D5.0环境,便于用户快速上手并进行实验验证。通过对不同参数的调整,可以模拟多种类型的岩石破坏行为,为实际工程项目提供理论支持。
内容概要:本文详细介绍了如何使用Fluent进行激光焊接的数值模拟,重点讲解了锥形高斯热源的建模方法。文章首先解释了锥形高斯热源的特点及其与普通高斯热源的区别,然后给出了具体的UDF代码实现,包括热源强度的计算、热流衰减的控制以及热源移动的实现。此外,还讨论了网格划分、材料参数设置、常见错误排查和优化技巧等方面的内容。通过实例和操作视频,帮助读者快速掌握激光焊接数值模拟的方法和技术要点。 适合人群:具有一定CFD基础并希望深入学习激光焊接数值模拟的研究人员和工程师。 使用场景及目标:适用于需要精确模拟激光焊接过程的研究项目或工业应用,旨在提高模拟精度,减少试验成本,优化焊接工艺参数。 其他说明:文中提供了大量实用的操作技巧和注意事项,如网格划分建议、材料参数选择、UDF代码调试等,有助于解决实际操作中可能遇到的问题。同时,附带的操作视频和GitHub上的完整案例包也为初学者提供了宝贵的学习资源。
序列化.md
"ResumePlatformFront 笔试面试全攻略与资源宝典"——一站式前端求职解决方案!精选高频笔试真题解析、大厂面试经验分享、实战项目模板及技能进阶指南,助你系统攻克前端求职难关。从简历优化到Offer谈判,覆盖求职全流程,配套免费资源库持续更新。无论应届生还是进阶开发者,这里都是你斩获心仪Offer的强力后盾!
weixin205微信小程序线上教育商城ssm(文档+源码)_kaic
内容概要:本文详细介绍了如何利用COMSOL软件构建岩石损伤与温度、渗流耦合的多物理场模型。首先解释了温度变化引起岩石膨胀/收缩以及渗流压力改变裂纹发展的物理机制,并通过PDE方程组进行描述。接着展示了具体的实现方法,如定义损伤变量、设置导热系数和渗透率随损伤变化的关系,以及引入温度修正的Mohr-Coulomb准则。文中还讨论了求解器配置技巧,强调了非线性收敛问题的解决方案。此外,作者分享了一些实际建模过程中遇到的问题及解决经验,如参数选择不当导致的模型发散等。 适合人群:从事岩土工程、地质工程及相关领域的研究人员和技术人员,特别是对多物理场耦合仿真感兴趣的学者。 使用场景及目标:适用于需要深入理解岩石在温度、渗流和应力共同作用下的损伤演化规律的研究项目。目标是帮助读者掌握COMSOL中多物理场耦合模型的建立方法,提高数值模拟的准确性。 其他说明:文章不仅提供了理论背景,还包括大量实用的代码片段和调试建议,有助于读者更好地理解和应用所学知识。
2023-04-06-项目笔记-第四百六十四阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.462局变量的作用域_462- 2025-04-10