当用户登录系统时,需要进行是否重复登录的判断,这时候需要用到监听器Listener,具体使用如下:
构建一个类SessionUserListener,具体实例如下:
package net.nk.struts.listener;
/**
* @author xiaoye
* @version create time:Oct 15, 2010 11:19:02 AM
* 类说明
*/
public class SessionUserListener implements HttpSessionListener {
//key为sessionId,value为HttpSession
private static java.util.Map<String, HttpSession> sessionMap = new java.util.concurrent.ConcurrentHashMap<String, HttpSession>(500);
protected final Logger logger = Logger.getLogger(SessionUserListener.class);
/**
* HttpSessionListener中的方法,在创建session
*/
public void sessionCreated(HttpSessionEvent event) {
}
/**
* HttpSessionListener中的方法,回收session时,删除sessionMap中对应的session
*/
public void sessionDestroyed(HttpSessionEvent event) {
getSessionMap().remove(event.getSession().getId());
}
/**
* 得到在线用户会话集合
*/
public static List<HttpSession> getUserSessions(){
List<HttpSession> list = new ArrayList<HttpSession>();
Iterator<String> iterator = getSessionMapKeySetIt();
while(iterator.hasNext()){
String key = iterator.next();
HttpSession session = getSessionMap().get(key);
list.add(session);
}
return list;
}
/**
* 得到用户对应会话map,key为用户ID,value为会话ID
*/
//
public static Map<String, String> getUserSessionMap(){
Map<String, String> map = new HashMap<String, String>();
Iterator<String> iter = getSessionMapKeySetIt();
while(iter.hasNext()){
String sessionId = iter.next();
HttpSession session = getSessionMap().get(sessionId);
SmUser user = (SmUser)session.getAttribute(Parameters.SESSION_USER);
if(user!=null){
map.put(user.getUserId(), sessionId);
}
}
return map;
}
/**
* 移除用户Session
*/
public synchronized static void removeUserSession(String userId){
Map<String, String> userSessionMap = getUserSessionMap();
if(userSessionMap.containsKey(userId)){
String sessionId = userSessionMap.get(userId);
getSessionMap().get(sessionId).invalidate();
getSessionMap().remove(sessionId);
}
}
/**
* 增加用户到session集合中
*/
public static void addUserSession(HttpSession seccion){
getSessionMap().put(seccion.getId(), seccion);
}
/**
* 移除一个session
*/
public static void removeSession(String sessionID){
getSessionMap().remove(sessionID);
}
public static boolean containsKey(String key){
return getSessionMap().containsKey(key);
}
/**
* 判断该用户是否已重复登录
* @param user
* @return
*/
public synchronized static boolean checkIfHasLogin(SmUser user){
Iterator<String> iter = getSessionMapKeySetIt();
while(iter.hasNext()){
String sessionId = iter.next();
HttpSession session = getSessionMap().get(sessionId);
SmUser sessionuser = (SmUser)session.getAttribute(Parameters.SESSION_USER);
if(sessionuser!=null){
if(sessionuser.getUserId().equals(user.getUserId())) return true;
}
}
return false;
}
/**
* 获取在线的sessionMap
*/
public static Map<String, HttpSession> getSessionMap() {
return sessionMap;
}
/**
* 获取在线sessionMap中的SessionId
*/
public static Iterator<String> getSessionMapKeySetIt() {
return getSessionMap().keySet().iterator();
}
}
在web.xml中配置一行以下代码加载该监听器:
<listener>
<listener-class>net.nk.struts.listener.SessionUserListener</listener-class>
</listener>
在登录的action中进行判断该用户是否重复登录了,示例代码如下:
Boolean hasLogin = SessionUserListener.checkIfHashLogin(smUser);
//如果重复登录了,则注销之前已登录的用户
if(hasLogin){
SessionUserListener.removeUserSession(userId);
}else{
//如果没有重复登录,则将该登录的用户信息添加入session中
request.getSession.setAttribute("userInfo",smUser);
//创建session
if(SessionUserListener.containsKey(request.getSession().getId())){
SessionUserListener.removeSession(request.getSession().getId());
}
SessionUserListener.addUserSession(request.getSession());
}
在退出系统的时候,需要注意将该session失效,示例如下:
request.getSession().setAttribute("userInfo",null);
request.getSession().invalidate();
分享到:
相关推荐
解决重复登陆问题@@@@@@
hibernate+struts2+spring 做的登录,模糊查询,判断重复添加数据的问题。有即时提示。登录窗口可以随意拖拽 。变幻颜色等。
为了防止用户的重复登录,在一开始想到的一种方法: 在用户表中添加一个字段,登录后写1,退出后写0.这样子在用户登录进行检查的时候判断这个字段是否为0,如果是0那么可以登录;但是这样子又带来了新的问题,...
用QT设计登录、注册界面,并与MySQL连接,可进行用户名是否为英文检测,用户名重复检测。
注册界面可判断密码为空、前后密码是否一致、账号名是否与数据库的重复;登陆界面错误提示淡入动画出现,界面清新整洁,有动态背景图 HTML注册登录
php+Ajax远程加载防止重复提交,登录表单loading效果,一个提高用户体验,二个防止避免重复提交表单,ajax判断加载是否完成。
用户登录注册功能,有客户端与服务器,代码有备注,功能完善,可以判断登录信息是否重复等,密码信息在本地文档。
作用:该类库可以防止按钮重复点击,可以判断网络状态,可以判断用户登录状态,以及自定义验证条件等等。 说明:其实现的核心原理就是通过自定义实现自身的OnClickListener类,并重写其中的onClick方法,在onClick...
文件能上传和下载,判断文件名是否重复进行询问是否覆盖,在断电的情况下能对文件进行断点续传,传输时进度显示(获取文件大小和传输速率估计完成时间);通过该软件能新建文件夹,文件名的修改,文件的删除;能搜索...
8.2.1 防止用户的重复登录(单点登录) 219 8.2.2 设计动态树状菜单栏 219 8.2.3 过滤和还原HTML字符 220 8.2.4 未读消息提示 221 8.3 公共类的封装与设计 224 8.3.1 实现判断数据是否存在 224 8.3.2 ...
没有使用自制模块和重复使用的子程序.方便新手学习. --注意----------------------------------------------------------------------- 记住.mysql的字符集 一定记得改为 gbk 不然中文用户名会成为乱码 用户名和密码...
用户登录图书馆管理系统后,进入图书馆主界面,如图1.9所示,通过此界面可看到图书借阅排行榜和读者借阅排行榜,通过排行榜可以看出借阅图书的名称、图书类型、借阅次数及借阅读者等相关信息。
其中注册实现了判断用户是否重复和注册成功的功能,登录就实现了判断用户和密码是否正确来实现登录成功;其中学生信息里面的所属班级是通过在学生管理数据库里面写入班级的id通过populate({path:"cls"})方法来连接...
其次考虑可以重复输入3次,这个重复操作要用到循环的while循环。 因此可以确定这个程序以if和while循环为主体。 先考虑用户名验证:如果用户名是"admin"才能继续输入密码,判断条件就是输入的用户名是否为...
用户可以使用该功能进行注册,在注册页面,用户需要输入注册邮箱,注册用户名和密码等注册必填信息,通过判断用户输入的邮箱格式是否正确,用户名是否重复;若格式不正确,或用户名重复,则给出提示进行重新注册 ...
android组件点击事件,防止重复点击,判断是否有网络,判断是否登录,点击事件执行之前定制化执行逻辑... 使用方式 屏蔽多次点击事件 /** * 测试快速点击事件 */ fastButton.setOnClickListener(new ...
用户可以使用该功能进行注册,在注册页面,用户需要输入注册邮箱,注册用户名和密码等注册必填信息,通过判断用户输入的邮箱格式是否正确,用户名是否重复;若格式不正确,或用户名重复,则给出提示进行重新注册 ...
例如,可以使用 if 语句来判断用户是否已登录,如果已登录则显示欢迎信息,否则显示登录链接。 循环语句:模板引擎可以根据循环语句来重复显示某些内容。例如,可以使用 for 语句来显示一个列表中的所有项。 ...
- 强化标签功能:单个标签使用统计、标签不再仅仅关联于主题而是与某一帖子对应、增加标签推荐功能、修正标签重复时重复统计BUG、增加单个标签长度的判断。 - 优化搜索页面,搜索出某类主题之后,可批量将其删除,...