`
arantam
  • 浏览: 41780 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

在Struts2下使用[拦截器]配合[session监听器]实现在线会员统计与防止重复登录

阅读更多

(哈,这标题可真够长的...)

 

需求:

1.管理员后台可显示当前在线访客数以及在线会员数(在线会员要求列出详细清单).

2.某个客户端非法退出(直接关闭浏览器或断电啥的)后,接着他重新登录系统.在线统计上要做到保持登录统计的准确性与完整性.

3.防止多个客户端同时使用一个帐户异地登录(后登录者踢掉先登录者,并通知先登录者被迫下线).

 

 

1.监听器SessionListener (web.xml的代码略)

/**
	 * 创建session
	 */
	public void sessionCreated(HttpSessionEvent se) {
		OnlineStatistics.increase();
	}

	/**
	 * 服务器销毁session对象
	 */
	public void sessionDestroyed(HttpSessionEvent se) {
		OnlineStatistics.decrease();
	}

	/**
	 * 用户登录时
	 */
	public void attributeAdded(HttpSessionBindingEvent se) {
		if ("memberInfo".equals(se.getName())) {
			MemberInfo memberInfo = (MemberInfo) se.getValue();
			OnlineStatistics.addAttr(memberInfo);
			se.getSession().setMaxInactiveInterval(60 * 20);// 失效时间SEC * MINS
		}
	}

	/**
	 * 用户退出登录(销毁session属性时)
	 */
	public void attributeRemoved(HttpSessionBindingEvent se) {
		if ("memberInfo".equals(se.getName())) {
			MemberInfo memberInfo = (MemberInfo) se.getValue();
			OnlineStatistics.removeAttr(memberInfo);
			memberInfo = null;
		}
	}

	/**
	 * 待实现
	 */
	public void attributeReplaced(HttpSessionBindingEvent se) {
//to be extended
	}

 

 2. 统计类OnlineStatistics

/**
 * @author Arantam
 */
package com.farago.util;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import com.farago.vo.MemberInfo;

/**
 * @author Arantam
 * 
 */
@SuppressWarnings("unchecked")
public class OnlineStatistics {
	private static int count = 0;
	private static Set onlineMemberList = new HashSet();

	/**
	 * 统计在线总数(递增)
	 */
	public static void increase() {
		count++;
	}

	/**
	 * 统计在线人数(递减)
	 */
	public static void decrease() {
		count--;
	}

	/**
	 * 统计在线会员(添加)
	 * 
	 * @param memberInfo
	 */
	public static void addAttr(MemberInfo memberInfo) {
		// 如果在线会员列表不为空,则迭代该列表,检查当前登录的会员id与列表中的记录id是否一致.
		Iterator itr = onlineMemberList.iterator();
		while (itr.hasNext()) {
			// 先判断该会员是否已有session信息保存在统计对象中.若有,把旧的挤掉,再放入新的.
			MemberInfo temp = (MemberInfo) itr.next();
			String memberName = temp.getName();// 保存在统计类中的用户名
			if (memberInfo.getName().equals(memberName)) {
				itr.remove();
			}
		}
		onlineMemberList.add(memberInfo);
	}

	/**
	 * 统计在线会员(清除)
	 * 
	 * @param memberInfo
	 */
	public static void removeAttr(MemberInfo memberInfo) {
		onlineMemberList.remove(memberInfo);
	}

	/**
	 * 获取在线访客的数量
	 * 
	 * @return the count
	 */
	public static int getOnlineVisitors() {
		return count - 1;// 除去管理员本身
	}

	/**
	 * 获取在线会员的列表
	 * 
	 * @return the onlineMemberList
	 */
	public static Set getOnlineMemberList() {
		return onlineMemberList;
	}

	/**
	 * 根据登录时间判断登录次序的先后
	 * 
	 * @param memberInfo
	 * @return
	 */
	public static boolean isOld(MemberInfo memberInfo) {
		Iterator itr = onlineMemberList.iterator();
		while (itr.hasNext()) {
			MemberInfo temp = (MemberInfo) itr.next();
			String memberName = temp.getName();// 保存在统计类中的用户名
			Date loginTime = temp.getLoginTime();// 保存在统计类中的用户登录时间
			if (memberInfo.getName().equals(memberName) && memberInfo.getLoginTime().before(loginTime)) {
				// 如果当前用户的登录时间比统计对象里保存的同名用户的登录时间要早,则返回true
				return true;
			}
		}
		return false;
	}

}

 

 

3. 拦截器代码片断

Map sessionMap = invocation.getInvocationContext().getSession();
		if (sessionMap.get("memberInfo") != null) {
			MemberInfo memberInfo = (MemberInfo) sessionMap.get("memberInfo");

			/**
			 * 
			 */
			if (OnlineStatistics.isOld(memberInfo)) {
				sessionMap.remove("memberInfo");// 清除session
				faragoMessage = "对不起,您的帐号[" + memberInfo.getName() + "]已在别的地方登录,您已被迫退出。若有疑问请联系管理员,谢谢!";
				ctx.put("faragoMessage", faragoMessage);
				return Action.ERROR;
			}
......
...

 

 

 

如果想在前台也显示当前在线人数,可以在sessionCreated和sessionDestroyed方法中处理,把统计数字放入ServletContext里面.然后使用S2的标签直接显示.这样来得方便.呵呵

 

 

完.

 

 

 

 

--- 谭剑 2010-7-6

 

1
4
分享到:
评论
7 楼 304113037 2012-03-12  
难道SessionListener 需要实现HttpSessionAttributeListener、HttpSessionListener两个接口?
6 楼 304113037 2012-03-12  
楼主,请问SessionListener 类是实现HttpSessionAttributeListener接口吗?我实现的是这个接口为什么就只执行attributeAdded(HttpSessionBindingEvent se)方法,不执行sessionCreated(HttpSessionEvent se)这个呢,如果把接口改为HttpSessionListener就只执行sessionCreated(HttpSessionEvent se)方法,这是怎么回事?
5 楼 zqb666kkk 2012-02-28  
楼主没有开源精神 你要是 发表个东西 还遮遮掩掩 的 劝你还是不要发表了
4 楼 sys_ks_cnm 2012-02-23  
Map sessionMap = invocation.getInvocationContext().getSession();   这个是从哪里得到的
3 楼 zqb666kkk 2011-04-09  
最近要做一个相关的系统,可否把完整例子贴出来
2 楼 arantam 2010-09-12  
lijunjie337 写道
最好把代码也上传,呵呵~~

关键代码都在这里了,还最好把代码也上传?
呵呵,午餐为你准备好了,要吃的话还是自己动手吧.
1 楼 lijunjie337 2010-07-06  
最好把代码也上传,呵呵~~

相关推荐

    Spring+Struts2+ibatis 异地登录 HttpSessionBindingListener

    在Java Web开发中,Spring、Struts2和iBatis是常见的三大框架,它们共同构建了一个功能强大的MVC(Model-...同时,通过合理设计拦截器、令牌机制和其他验证策略,我们可以进一步优化登录流程,防止非法访问和数据泄露。

    struts2详细网站访问总人数统计(点击率)

    总之,Struts2框架提供了灵活的机制来实现网站访问总人数统计,通过拦截器、Action和数据持久化等手段,我们可以构建一个高效、可靠的点击率统计系统。通过深入理解Struts2的工作原理和提供的工具,开发者可以更好地...

    SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器

    在Struts2中,可以使用Session来存储一个唯一的令牌,每次表单提交时检查这个令牌,如果发现重复则拒绝处理。另一种方法是在表单提交后禁用提交按钮,或者使用JavaScript监听提交事件,阻止额外的提交请求。 最后,...

    Struts2+hibernate实现登陆和增删改

    在"Struts2+Hibernate实现登录和增删改"这个项目中,首先我们需要理解这两个框架的核心概念和工作原理: 1. **Struts2**:Struts2的核心是Action类,它处理用户的请求,并通过配置文件(struts.xml)来定义动作与...

    struts2与hibernate的整合实现数据的crud

    `使用需知.txt`可能包含了整合过程中的注意事项和步骤,例如如何配置Struts2的拦截器来支持Hibernate的事务管理,或者在JSP页面中如何正确绑定数据到表单元素,以及如何处理可能出现的异常等。 `Tabletemplate`可能...

    学习常用知识(java,sql,oracle,ejb,ssh,struts,xml,监听器,拦截器,过滤器)

    在IT领域,掌握Java、SQL、Oracle、EJB、SSH、Struts、XML以及监听器、拦截器和过滤器等技术是至关重要的。这些技术涵盖了Web应用开发的多个层面,对于初学者而言,理解并熟练运用它们能为职业生涯打下坚实的基础。 ...

    拦截器和控制器的区别

    2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求后各调一次。 4、拦截器可以利用依赖注入,因此在spring框架程序中,...

    struts2 interceptor介绍

    在Struts2框架中,Interceptor(拦截器)扮演着极其关键的角色,它不仅能够增强框架的灵活性,还能提供一系列强大的功能,包括但不限于权限控制、事务管理、数据验证等。本文将深入探讨Struts2 Interceptor的原理、...

    防止表单重复提交

    通过这样的方式,我们可以在Struts2框架下有效地防止表单重复提交。同时,还可以结合其他策略,如使用AJAX异步提交,进一步增强用户体验。总的来说,防止表单重复提交是一个多层面、多层次的问题,需要综合运用...

    JavaWeb-Hibernate-Struts2-Spring2

    - **Struts2.0中文教程.chm**:这个文件很可能是关于Struts2框架的详细指南,包括其架构、配置、拦截器和Action的使用等内容。 - **Spring2.0中文教程.chm**:这个教程应该讲解了Spring2的核心特性,如IoC、AOP,...

    session共享jar包(三个)

    1. **配置Tomcat**:在Tomcat的web.xml中,配置自定义的session配置,比如使用一个实现了`HttpSessionListener`的类来监听session事件,并将其保存到Redis。 2. **配置Redis**:确保Redis服务器正常运行,并且配置...

    Struts2 笔记12-20 浪曦风中叶

    ### Struts2 笔记12-20 浪曦风中叶 ...通过以上总结,我们深入了解了 Struts2 中监听器的创建和使用、自动拦截器的设计思路以及文件上传下载的具体实现方法。这些知识点对于理解和掌握 Struts2 框架至关重要。

    J2EE框架-重复提交、重复刷新、防止后退的问题以及处理方式

    - 利用Struts拦截器(Interceptor),可以实现通用的重复提交检查,拦截并处理重复的请求。 - **基本原理** 服务器端的Token机制主要是基于一次性的标识,确保每个请求的唯一性,防止同一个请求被多次处理。 -...

    开发者突击 Struts2整合Hibernate

    首先,需要在项目的`web.xml`中配置Struts2的前端控制器`DispatcherServlet`,并添加相应的过滤器和监听器。 2. **添加Hibernate依赖** 在项目中引入Hibernate的库,包括核心库、JDBC驱动以及所需的其他依赖。 3...

    vaadin仿照struts2改造

    6. **转换与验证**:在Struts2中,有专门的转换器(Converter)和验证器(Validator)机制,而在Vaadin中,可以使用`ValueChangeListener`监听值的变化,以及`Validator`接口进行数据验证。 7. **服务层与持久层的...

    struts学习笔记

    2. **拦截器栈**:通过`<interceptor-stack>`定义一组拦截器的执行顺序,使用`<interceptor-ref>`引用单个拦截器。 #### 五、默认拦截器引用 `<default-interceptor-ref/>`标签用于在`<package>`中指定所有Action...

    struts2配置文件

    6. **web.xml**:虽然不是Struts2特有的配置文件,但它是所有Servlet应用的标准部署描述符,用于配置过滤器、监听器和Servlet,包括Struts2的前端控制器`StrutsPrepareAndExecuteFilter`。 学习和理解这些配置文件...

    应付struts2考试有这个就够了.docx

    - 拦截器是Struts2的一个强大特性,允许在Action执行前后插入自定义逻辑。在上述配置中,`msg`拦截器被定义并应用于`users` Action,这可能是用来处理用户交互消息或验证的。 5. **Action类(UserAction.java)** ...

    Struts2.0 实现文件上传进度

    1. **配置Struts2.0**:在struts.xml配置文件中,你需要启用Struts2的FileUpload拦截器,它负责解析multipart请求。以下是一个基本的配置示例: ```xml <package name="default" namespace="/" extends="struts-...

Global site tag (gtag.js) - Google Analytics