- 浏览: 580433 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (411)
- webservice (3)
- oracle (37)
- sqlserver (8)
- j2ee (56)
- linux (7)
- javaweb (47)
- office (1)
- struts (23)
- hibernate (11)
- spring (29)
- 网络 (2)
- tomcat (13)
- tongweb (0)
- weblogic (0)
- powerdesiginer (3)
- svn (3)
- js (20)
- ie (2)
- 编译 (3)
- css (2)
- 操作系统 (5)
- Android (41)
- jbpm4.3 (1)
- fckeditor (3)
- 操作excel (2)
- db2常用命令 (1)
- ibatis (5)
- mysql (16)
- 表达式语言 (1)
- java方式调用存储过程 (1)
- ca (1)
- linux客户端 (1)
- 电子数码 (1)
- 行业应用 (12)
- 开发工具 (4)
- 面试 (1)
- 计算机原理 (1)
- NOSQL (5)
- 虚拟机 (1)
- nginx (0)
- velocity (2)
- jndi (1)
- spring mvc (39)
- springmvc (32)
- 安全 (5)
- htmleditor (6)
- iphone4 (1)
- html (4)
- jstl (2)
- ckeditor (5)
- 连接池 (1)
- jquery (6)
- 分页 (1)
- 技术研发规则 (1)
- javamail (1)
- maven (2)
- upload (1)
- log (1)
- 测试 (10)
- spring roo (1)
- 版本控制 (2)
- find bugs (0)
- jsf (0)
- springroo (0)
- 小道理 (1)
- 小道理,技术标准 (1)
- jsf (0)
- bitbao (2)
- redmine (3)
- 团队意识 (1)
- mybatis (2)
- jquery mobile (1)
- flexpaper (0)
- json (4)
- URLRewriteFilte (1)
- html5 (1)
- 都乐保活动 (0)
- openfire (0)
- TreeMap (1)
- build (0)
- javaweb,tag (0)
- algorithm (1)
- tag (2)
- 扯淡 (0)
- mac (2)
- 叶一火(老一) (1)
- 游玩 (1)
- 编码 (1)
- 上线部署 (0)
- 研发管理 (0)
- thumbnailator (2)
- 旅游 (0)
- bingweibo (1)
- 杂谈 (4)
- ktv (1)
- weibo (1)
- 爱情 (2)
- 饮食 (1)
- MediaWiki (1)
- git (1)
- 版本库 (1)
- servlet (1)
- 感悟 (1)
- 人生 (1)
- highcharts (1)
- poi (0)
- websphere (0)
- php (1)
最新评论
-
woshixushigang:
good
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
nathanleewei:
org.springframework.jdbc.core.B ...
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
浪禾木:
请问是ckeditor\contents.css吗?改过以后 ...
ckeditor自动换行问题 -
simusuishi:
刚哥威武!
ckeditor取值赋值问题 -
a455642158:
收割完毕……
Android开源项目源码下载(不断更新中)
1.了解如何使用HttpSessionListener监听session的销毁。
2.了解如何使用HttpSessionBindingListener监听session的销毁。
一. 使用HttpSessionListener
编写一个OnlineUserListener。
package anni;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute("username");
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(username);
System.out.println(username + "超时退出。");
}
}
OnlineUserListener 实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们
这里只用到sessionDestroyed()在session销毁时进行操作就可以。
从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行
时删除即可。
为了让监听器发挥作用,我们将它添加到web.xml中:
<listener>
<listener-class>anni.OnlineUserListener</listener-class>
</listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1.
执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行
操作了,所以LogoutServlet.java的内容现在是这样。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
2.
如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。
二. 使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事
件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。
// 把用户名放入在线列表
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。
HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在
线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 把用户名放入在线列表
List onlineUserList = (List) application.getAttribute("onlineUserList");
// 第一次使用前,需要初始化
if (onlineUserList == null) {
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
}
onlineUserList.add(this.username);
}
username已经通过构造方法传递给listener,在数据绑定时,可以直接把它放入用户列表。
与之对应的valueUnbound()方法,代码如下:
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(this.username);
System.out.println(this.username + "退出。");
}
这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。
valueUnbound的触发条件是以下三种情况:
1.
执行session.invalidate()时。
2.
session超时,自动销毁时。
3.
执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。
发表评论
-
Servlet线程安全问题
2012-10-07 11:52 1025进来休息下,来点我吧 摘 要:介绍了Servlet多线程 ... -
Collections.addAll
2012-09-07 18:04 2334collections用法以及list 简单实例 Colle ... -
string
2012-09-06 17:20 895String a = "ab"; ... -
mapper.readValue读取null
2012-08-17 19:21 2629如下代码,这样写不会走catch方法,此方法不报ioExcep ... -
string.split(",")返回的长度问题
2012-08-17 15:38 922String test = "#我的测试#&q ... -
thumbnailator 图片缩放问题
2012-08-17 19:29 2763这段代码上传1.7m图片会报错: publ ... -
模拟微博新鲜事短网址处理方式
2012-08-16 17:40 0a -
新鲜事短连接
2012-08-19 12:01 963现在需求如下: 使 ... -
jackson objectMapper.readValue 读取并存成想要的类型
2012-07-26 20:16 3730两种方式: java反射里面有个很有趣的东东,反射解析成li ... -
spring mvc responseBody 会把特殊字符转义
2012-07-26 19:53 4523框架用的spring 采用spring mvc 方式进行图片上 ... -
图片复制
2012-07-05 11:53 1072import java.io.File;import java ... -
thumbnailator 图片缩放
2012-07-04 20:10 1397Thumbnailator是一个用来生成图像缩略图的 J ... -
spring mvc 自己遇到的几个错误
2012-06-13 14:36 1209where 1=1 and t.name like '%&q ... -
Request method 'POST' not supported
2012-06-08 10:53 5215项目采用spring mvc框架实现,插入数据时候采用 ... -
org.codehaus.jackson.map.JsonMappingException
2012-08-17 19:30 999当一个类的所有属性都没有getter时(所有属性都是publi ... -
mysql 时间比较
2012-06-05 19:57 1弱智得问题,分开写 SELECT * FROM bb_ ... -
validApiToken
2012-08-10 11:26 982/** * 检验token的有效性 * @p ... -
thumbnailator 图片放缩
2012-05-21 13:44 0thumbnailator 图片放缩 Thum ... -
spring mvc title展示的几种写法
2012-05-18 17:16 1101我记录的是工作中遇到的,容易忽视的问题,高手可以绕行了。积累也 ... -
c:set 默认范围
2012-05-16 16:23 660做项目时候遇到 页面包含另一个页面,但是要通过c 标签方式 赋 ...
相关推荐
在本主题“day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付”中,我们将深入探讨这些关键知识点。 首先,让我们了解监听器的作用。监听器是...
注意,Session有一个默认的超时时间,超过这个时间未有任何操作,Session将被销毁。可以通过`session.setMaxInactiveInterval(int interval)`设置超时时间,单位为秒。 **超时跳转(Session Timeout Redirect)** ...
首先,开发者可能尝试使用Session监听器(HttpSessionListener)来检测Session的过期。监听器是Java Servlet规范的一部分,允许我们注册监听器以响应特定的事件,如Session的创建和销毁。在`web.xml`文件中,我们...
一是设置Session监听器,监听Session的销毁事件;二是每次接收到请求时,检查Session的有效性,如果过期则进行处理。 3. **Session过期后的处理**:常见的处理方式包括: - 弹出登录框:当检测到Session过期,...
根据提供的文件信息,本文将详细解释如何在ASP.NET应用程序中实现关闭页面时清除Session状态的...通过监听页面卸载事件并在合适的时机调用Session清除方法,可以有效地管理Session生命周期,提高系统的性能和安全性。
当用户在应用程序的不同页面之间跳转时,存储在Session中的变量不会被销毁,而会在整个用户会话期间一直存在。这种机制可以方便地在多个页面间共享数据,并且有助于提高用户体验。 #### 清除Session的重要性 清除...
3. **Session监听器**:在Tomcat中注册监听器,监控session的创建、更新、销毁等事件,并相应地在Redis中进行操作。 4. **配置文件**:可能包含示例或默认的配置文件,用于设置Redis服务器的地址、端口、超时时间等...
3. 配置session监听器:可能需要创建一个实现了`javax.servlet.http.HttpSessionListener`接口的类,以便在session创建和销毁时进行相应操作,例如同步Redis中的session状态。 4. 重启Tomcat:完成上述配置后,重启...
Spring MVC提供了`HttpSessionListener`和`HttpSessionAttributeListener`接口,可以监听Session的创建、修改和销毁事件。我们可以通过创建一个实现了这些接口的类,将Session数据存储到Redis中。同时,需要配置...
- **监听器**:在`Tomcat`中添加`SessionListener`,以便在`session`创建、销毁时通知`Redis`,保持两者同步。 - **冲突解决**:在分布式环境下,可能有多个服务器同时尝试更新同一`session`,需要确保`Redis`的...
- session:在整个会话期间有效,直到会话结束或显式销毁。 - application:在整个Web应用生命周期内有效,直到Web应用停止。 **Filter(过滤器)** 过滤器在Web应用中用于拦截请求,实现预处理或后处理。常见的...
监听器是Servlet API的一部分,可以监听特定事件,比如session的创建和销毁。我们创建一个`SessionListener`,在session创建时记录用户登录,在session销毁时记录用户退出。 11. **配置Web.xml** 在`WEB-INF/web....
在本例中,我们监听session的创建和销毁事件,以跟踪在线人数的变化。当用户首次访问网站并创建session时,我们可以将用户视为在线;当用户关闭浏览器或者session超时,session被销毁,我们则减少在线人数。 2. **`...
在JSP开发中,Spring MVC项目常常用于构建复杂的Web...当用户尝试在第二个浏览器中登录时,第一个浏览器的session会被销毁,用户需要重新登录。这种方法有效地防止了同一账号在多个地方同时在线,增强了系统的安全性。
6. 用户注销:在用户选择注销操作后,需要在服务器端销毁session,以清除用户的所有会话数据。 整个购物车的实现需要考虑到数据的安全性,例如密码传输需要进行加密,session数据存储时要有防止跨站脚本攻击(XSS)...
例如,我们可以监听Session的创建和销毁: ```xml <listener-class>com.example.SessionCreationListener</listener-class> <listener-class>com.example.SessionDestroyListener</listener-class> ``` 这里...
6. **监听器(Listener)**:监听器是用于响应特定事件的Java类,如session的创建、销毁、超时等。它们通过实现特定接口并注册到Web应用的部署描述符(web.xml)中。在用户登录注册场景下,监听器可能用于跟踪...
例如,可以自定义一个`HttpSessionBindingListener`来监听session的创建和销毁,实现session数据的持久化: ```java public class RedisSessionManager implements HttpSessionBindingListener { private Jedis ...
Tomcat服务器的默认监听端口为8080。 4. **JSP中include指令与include动作的区别** - `include`指令是静态包含,它将被包含页面的源代码直接合并到当前页面,编译时完成,不关心被包含页面的后续修改。 - `...
Session监听器在Java Web开发中用于监听Session的创建和销毁事件,可能在这个场景中用于跟踪用户的分页状态。当用户从一页跳转到另一页时,可以在Session中存储当前的页码,以便在用户再次访问时恢复之前的浏览位置...