当用户登录系统时,需要进行是否重复登录的判断,这时候需要用到监听器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();
分享到:
相关推荐
在IT行业中,尤其是在开发Web应用时,重复登录问题是一个常见的挑战。这通常涉及到用户尝试登录时,系统如何处理已存在的在线会话,特别是在多设备、多窗口或浏览器标签页同时登录的情况下。本篇文章将深入探讨如何...
在本项目中,我们利用了Spring Boot、Mybatis Plus和Thymeleaf三大技术栈来构建一个用户管理系统,其中包含了用户登录以及校验用户名是否重复的功能。以下将详细阐述这三者之间的配合以及如何实现所述功能。 首先,...
hibernate+struts2+spring 做的登录,模糊查询,判断重复添加数据的问题。有即时提示。登录窗口可以随意拖拽 。变幻颜色等。
在Web开发中,权限检查和控制重复登录是关键的安全措施,以确保用户数据的安全性和系统的稳定性。本资源"struts2_session_权限检查并控制重复登录源码"提供了一个具体的实现方案,下面我们将深入探讨相关的知识点。 ...
为了防止用户的重复登录,在一开始想到的一种方法: 在用户表中添加一个字段,登录后写1,退出后写0.这样子在用户登录进行检查的时候判断这个字段是否为0,如果是0那么可以登录;但是这样子又带来了新的问题,...
如果检测到同一账号的另一个登录请求,服务器可以判断为重复登录,并采取相应的措施,比如注销旧的会话或者拒绝新的登录请求。 在LoginListenerWeb这个压缩包中,我们可以推测它包含了一个监听用户登录事件的Web...
- 监听滚动事件,判断用户是否接近或到达页面底部。 - 发送Ajax请求,请求新的数据条目。 - 接收到响应后,将新数据插入到下拉列表中,确保正确渲染。 - 更新DOM,避免重复加载相同的数据。 5. **实际应用中的...
在本文中,我们将深入探讨如何使用QT框架设计一个功能完备的登录和注册界面,并与MySQL数据库进行连接,实现用户验证和数据存储。首先,我们来理解一下QT是什么以及它的核心功能。 QT是一个跨平台的C++图形用户界面...
在Java Web开发中,防止多用户重复登录是一个重要的安全措施,确保每个账号只能在一个设备或浏览器会话中活跃。常见的解决方法有两种,本文主要探讨第二种方案。 首先,第一种解决方案是通过在数据库中添加一个标志...
在现代网页开发中,表单验证是不可或缺的一个环节,尤其当涉及到用户注册、登录等场景时,对用户名的唯一性验证是保证系统稳定运行的重要措施。本文将通过实例展示如何利用layui前端框架结合ajax技术实现表单验证中...
总结来说,Java实现用户不可重复登录功能主要是通过管理session,结合用户唯一标识来判断和处理重复登录情况。通过合理的代码设计和策略,可以有效地防止同一账号的多次登录,提升系统的安全性。
使用过滤器的好处是避免了在每个页面的代码中重复编写判断用户是否登录的逻辑,既保证了代码的整洁,也使得维护更加方便。通过集中管理登录验证逻辑,系统的安全性也得到了加强。 综上所述,使用servlet+jsp实现...
在Java编程中,判断一个字符串是否为有效的手机号码是一个常见的任务。这通常涉及到字符串处理、正则表达式和条件判断等技术。以下是一篇详细解释如何使用Java来验证手机号码的文章。 首先,我们需要理解中国的手机...
### 解决Struts中通过Token防止重复提交的问题 在Web应用程序开发中,特别是基于MVC架构的框架如Apache Struts中,确保用户操作的安全性是非常重要的。其中一项常见且重要的安全措施是防止表单的重复提交。本文将...
当用户成功登录后,服务器会创建一个session并存储用户的登录信息,每次后续请求时,服务器会检查session中的信息,判断用户是否已登录,防止同一用户重复登录。 6. **安全机制**: 在注册过程中,系统可能包含防止...
1. **用户登录状态验证**:这通常涉及检查HTTP请求中的Session、Cookie或者Token(如JWT)来判断用户是否已登录。如果未登录,基类可以抛出异常或者返回特定的HTTP状态码告知客户端。 2. **角色或权限检查**:一旦...
例如,`checkUser`云函数可以查询用户表,判断用户名和电话号码是否已存在,而`registerUser`云函数则负责将新用户信息插入数据库。 6. **异常处理与安全性**:在实际开发中,除了检查重复注册外,还需要考虑其他...
6. **JavaScript处理响应**:收到服务器响应后,使用`xhr.responseText`或`xhr.responseJSON`(取决于服务器返回的数据类型)获取数据,并根据返回的“success”字段判断用户名是否重复。然后,可以使用DOM操作或者...
这个问题的解决方案是,判断用户是否已经登录过,如果已经登录过了,那么就不能再次登录。 常见的处理方法是,在用户登录时,判断此用户是否已经在 Application 中存在,如果存在就报错,不存在的话就加到 ...
- **用户体验优化**:自动检测用户登录状态,减少用户重复登录的次数,提高系统的易用性。 #### 五、总结 登录拦截器是Web应用中一种常见的安全控制手段,能够有效地控制用户访问权限,保护系统资源的安全。通过...