实现原理,利用HttpSessionListener的监视监听功能。用户登录成功后,在HashMap中放置一组sessionId和userName的组队,对HashMap中的键值信息登录实时进行维护,利用HashMap来判断用户是否已经登录,当前是否在线,然后根据需要是否进行session(假session,指的是hashmap中保存的键值信息)剔除。
1、以下是用于用户登录监听的SessionListener java文件源码:
/**
* Created by ICTREP IDEA.
* User: lnw
* Date: 2011-3-21
* Time: 17:28:33
* To change this template use File | Settings | File Templates.
*/
public class SessionListener implements HttpSessionListener {
private static final Logger m_logger = Logger.getLogger(LogonAction.class);//用于log4j调试
private static HashMap hashUserName = new HashMap();//保存sessionID和username的映射
/**以下是实现HttpSessionListener中的方法**/
public void sessionCreated(HttpSessionEvent sessionEvent){
}
public void sessionDestroyed(HttpSessionEvent sessionEvent){
hashUserName.remove(sessionEvent.getSession().getId());
}
/**
* isLogining-用于判断用户是否已经登录
* @param sessionUserName String-登录的用户名
* @return boolean-该用户是否已经登录的标志
* */
public static boolean isLogining(String sessionUserName) throws Exception{
return hashUserName.containsValue(sessionUserName);
}
/*
* isOnline-用于判断用户是否在线
* @param session HttpSession-登录的用户名称
* @return boolean-该用户是否在线的标志
*/
public static boolean isOnline(HttpSession session) throws Exception{
return hashUserName.containsKey(session.getId());
}
/*
* createUserSession-用于建立用户session
* @param sessionUserName String-登录的用户名称
*/
public static void createUserSession(HttpSession session,String sessionUserName) throws Exception {
hashUserName.put(session.getId(),sessionUserName);
if(m_logger.isDebugEnabled()){//log4j调试信息
Iterator debugIter = hashUserName.entrySet().iterator();
while (debugIter.hasNext()){
Map.Entry entry = (Map.Entry)debugIter.next();
Object key = entry.getKey();
Object val = entry.getValue();
m_logger.debug(sessionUserName);
m_logger.debug(key.toString());
m_logger.debug(val.toString());
}
}//log4j调试信息结束
}
/*
* createUserSession-根据用户名剔除session
* @param sessionUserName String-登录的用户名称
*/
public static void removeUserSession(String sessionUserName) throws Exception{
Iterator iter = hashUserName.entrySet().iterator();
while (iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if(((String)val).equals(sessionUserName)){
hashUserName.put(key,null);
iter.remove();
//hashUserName.remove(key);//当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。
}
}
}
/*
* replaceUserSession-用户已经登录则进行session剔除,否则建立新的session
* @param sUserName String-登录的用户名称
*/
public static void replaceUserSession(HttpSession session,String sessionUserName) throws Exception {
if(hashUserName.containsValue(sessionUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hashUserName中)
//遍历原来的hashUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hashUserName.entrySet().iterator();
while (iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if(((String)val).equals(sessionUserName)){
hashUserName.put(key,null);
iter.remove();
//hashUserName.remove(key);//当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。
}
}
hashUserName.put(session.getId(),sessionUserName);//添加现在的sessionID和username
}else{//如果该用户没登录过,直接添加现在的sessionID和username
hashUserName.put(session.getId(),sessionUserName);
}
if(m_logger.isDebugEnabled()){//log4j调试信息
Iterator debugIter = hashUserName.entrySet().iterator();
while (debugIter.hasNext()){
Map.Entry entry = (Map.Entry)debugIter.next();
Object key = entry.getKey();
Object val = entry.getValue();
m_logger.debug(sessionUserName);
m_logger.debug(key.toString());
m_logger.debug(val.toString());
}
}//log4j调试信息结束
}
}
------------------------------------------------------------------
2、以下是jsp页面用于判断用户是否已登录(session失效)的部分代码:
<html:html>
<head>
<title>here is title</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="css/maincss.css" rel="stylesheet" type="text/css">
</head>
<body>
<%
//UserInfoForm为后台定义的获取用户登录信息及保存用户相关信息的一个java bean,userSession为用户登录Action时根据需要组装的放置用户信息的一个bean对象-UserInfoForm,登录成功后被放到session里(这里的session指HttpSession,即服务端根据每个客户端链接产生的带有唯一sessionId)。
UserInfoForm userInfoForm = (UserInfoForm)request.getSession().getAttribute("userSession");
//System.out.println("userName="+userInfoForm.getUserName());
if(userInfoForm.getUserName()==null||userInfoForm.getUserName().equals("")){//从session获取用户信息失败,用户没有登录或session已经超时,返回到登录页面
RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
dispatcher.forward(request,response);
}else{
if(!SessionListener.isLogining(userInfoForm.getUserName())){//用户没有登录或session已经超时
RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
dispatcher.forward(request,response);
}else{
if(!SessionListener.isOnline(request.getSession())){//当前用户不在线,即session已经被剔除
RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
dispatcher.forward(request,response);
}
}
}
%>
</body>
</html:html>
3. 注意:最后别忘了在web.xml文件中配置监听器SessionListener:
<listener>
<listener-class>com.projectsSrcPath.SessionListener</listener-class>
</listener>
分享到:
相关推荐
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
用HttpSessionListener实现在线人数和历史访问量的统计
HttpSessionListener 和HttpSessionBindingListener的区别 HttpSessionBindingListener单点登录。
jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。
主要介绍了Spring boot通过HttpSessionListener监听器统计在线人数的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
用户注销 非正常退出 session失效 三种情况来进行 控制 分别使用了两种方式 进行了实现1:不修改数据库使用HashMap+HttpSessionListener 2:给数据库添加online列 使用(数据库脚本包含在内)HashMap+...
基于Spring+Struts2+ibatis框架,利用 HttpSessionBindingListener接口进行监听,实现防止异地登录,配有全部代码及sql数据库表
主要介绍了java 在Jetty9中使用HttpSessionListener和Filter的相关资料,需要的朋友可以参考下
* 用户登录 v1.8 sql注入的演示 v1.9 * 分销商树的展现 v2.0 * 修改区域和分销商 v2.1 * 添加区域或分销商 v2.2 * 删除区域和分销商 v2.3 * 修改密码 * 会计核算期间维护 * 建立物料对象...
您好,请访问:http://msdn.microsoft.com/zh-cn/library/aa478989.aspx [^] Yours Farhad。
jsp中唯一登录,使用session控制.
使用SessionListener+持久化Session+Springmvc拦截器实现单点登录
实现的接口:ServletRequestListener,HttpSessionListener,ServletContextListener 工程的大致步骤: 1.自定义实现三个监听器的类 2.使用注解的方法注册监听器 3.部署工程并运行,在控制台会输出相应的信息
public class DialogHttpSessionListner implements HttpSessionListener { private static Map, HttpSession> httpssessionmap = new Hashtable, HttpSession>(); // private UserVo uservo=new UserVo(); ...
springBoot Guava Cache(java工具类集... ... ...Nginx:反向代理服务器,Nginx搭建支持用户头像等静态资源的访问 ...Spring Admin(外部监控)、Spring Actuator(内部监控平台) ...HttpSessionListener监听器统计系统当前在线人数
实现在线人的显示,通过实现ServletContenxListener,HttpSessionListener,HttpSessionAttributeListener来实现在线人的展示
###主要特征直到用户登录后才创建会话GET请求与Ajax一起导航,而无需浏览器更改页面History.js用于管理浏览器的后退/前进功能,而无需刷新整个页面页面可以刷新和加书签应用服务器处理身份验证/授权向后兼容可在...
8.1. 使用HttpSessionListener 8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. 数据库设计 10.3. 功能设计...
此类通过监听器实现了在线人数统计,其原理很简单,就是每当增加一个HttpSession时就触发了实现HttpSessionListener接口的类的SessionCreated()方法,使在线人数加1....
【资源说明】 1、基于springboot+MyBatis实现的某房产平台系统源码+项目说明(毕设).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机...HttpSessionListener监听器统计系统当前在线人数