import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import cn.readsty.entity.User;
/**
*
* @author linkboyhot@sohu.com
*
*/
public class UserSessionListener implements HttpSessionListener{
/**保存sessionID和user的映射 */
private static Map<String,User> userPool = new HashMap<String,User>();
/**以下是实现HttpSessionListener中的方法**/
public void sessionCreated(HttpSessionEvent se){
}
public void sessionDestroyed(HttpSessionEvent se){
userPool.remove( se.getSession().getId() );
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUser -登录的用户Bean
* @return boolean-该用户是否已经登录过的标志
*/
public static boolean isAlreadyEnter(HttpSession session,User sUser){
boolean flag = false;
if(isHas(sUser)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户是否在userPool中)
flag = true;
//遍历原来的userPool,删除原用户名对应的sessionID(即删除原来的sessionID和User)
User user;
for(String key : userPool.keySet()){
user = userPool.get(key);
if(sUser.equals(user)){
userPool.remove(key);
}
}
userPool.put( session.getId(),sUser);//添加现在的sessionID和username
}
else{//如果该用户没登录过,直接添加现在的sessionID和User
flag = false;
userPool.put( session.getId(),sUser );
}
return flag;
}
public static boolean isHas(User user){
if(null != user){
for(String key : userPool.keySet()){
if(user.equals(userPool.get(key))){
return true;
}
}
}
return false;
}
/*
* isOnline-用于判断用户是否在线
* @param session HttpSession-登录的用户名称
* @return boolean-该用户是否在线的标志
*/
public static boolean isOnline(HttpSession session){
boolean flag = true;
if( userPool.containsKey( session.getId() ) ){
flag = true;
}
else{
flag = false;
}
return flag;
}
}
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.readsty.common.UserSessionListener;
import cn.readsty.service.manager.Constant;
/**
* 过滤器用于过滤用户是否登录
* @author linkboyhot@sohu.com
*
*/
public class IsLoginFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest cRequest, ServletResponse cResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)cRequest;
HttpServletResponse response = (HttpServletResponse)cResponse;
HttpSession session = request.getSession();
/**如果session中没有保存用户的登录信息*/
if(null == session.getAttribute(Constant.USER_INFO_IN_SESSION)){
request.setAttribute("message", 2);
request.getRequestDispatcher("/logout.jsp").forward(request, response);
/**如果在线用户池中无该用户*/
}else if(!UserSessionListener.isOnline(session)){
request.setAttribute("message", 3);
request.getRequestDispatcher("/logout.jsp").forward(request, response);
}else{
chain.doFilter(cRequest,cResponse);
}
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
分享到:
相关推荐
本文将详细探讨如何通过Android的广播接收器(BroadcastReceiver)来实现这个强制下线的功能。 首先,我们需要了解Android广播系统的基本原理。在Android中,广播是一种全局的消息传递机制,允许应用程序之间进行...
本教程将详细解析如何利用广播接收者来实现一个简单的强制用户下线功能。 首先,理解广播接收者的概念。在Android中,广播是一种全局的消息传递机制,任何应用都可以发送广播,其他应用可以注册广播接收者来监听并...
本文将深入探讨如何利用Android广播最佳实践来实现强制下线功能,帮助开发者更好地理解和应用这一关键机制。 一、Android广播基础知识 1. 系统广播:由Android系统触发,如设备开机、网络状态变化等。 2. 自定义...
在“Broadcast广播实现强制下线功能”这个主题中,我们将深入探讨如何利用Broadcast来实现在用户未正常操作时强制结束应用,确保系统的稳定性和安全性。 首先,我们需要了解BroadcastReceiver,它是接收广播消息的...
本教程针对初学者,将深入讲解如何利用广播实现强制下线功能,确保用户安全和应用的稳定运行。 首先,我们需要理解广播的基本概念。在Android系统中,BroadcastReceiver是接收并处理广播的类。当你注册了一个...
本篇文章将深入探讨如何实现这样的功能,主要关注“强制下线”这一核心概念。 强制下线功能的实现主要涉及以下几个关键步骤: 1. **用户状态跟踪**:首先,系统需要持续跟踪每个用户的在线状态。这通常通过心跳...
以下是实现强制下线功能的步骤: 1. **创建BroadcastReceiver**:首先,你需要创建一个自定义的BroadcastReceiver类,继承自Android的BroadcastReceiver。在这个类中,重写`onReceive()`方法,该方法会在接收到广播...
强制下线的思路: 只要在界面上弹出一个对话框让用户无法进行其他操作,必须点 对话框的确定按钮,然后返回到登陆界面,可是存在着一个问题 强制下线时可能存在任何一个界面,难道每个界面都要写对话框 ,这事我们就...
标题提到的“锐捷4.21破解强制下线问题”,意味着在锐捷客户端4.21版本之前,可能存在一个bug或者设计缺陷,导致用户在网络使用过程中会被管理员无预期地强制下线。这可能是由于管理员对网络资源的控制策略,或者是...
"BroadcastBestPractice强制下线demo"是针对Android广播机制的一个实例,主要展示了如何实现用户强制下线的功能。在这个项目中,开发者使用了一个名为ActivityCollector的类来集中管理所有的Activity,以便更方便地...
在本文中,我们将深入探讨如何利用ESP8266实现手机WiFi强制下线的功能,以及涉及的相关技术。 首先,我们要了解ESP8266的基本工作原理。ESP8266作为一个Wi-Fi客户端或接入点,能够发送和接收无线数据包。通过编程,...
在Java中,这可以通过Socket编程来实现,当服务器检测到需要强制下线的用户时,发送关闭连接的命令给客户端,客户端收到后执行关闭操作。 至于登录机制,尽管这个应用没有使用数据库,但仍然需要一种方式验证用户...
"Kotlin 实现强制下线功能详解" 在 Android 应用程序中,强制下线功能是一个非常重要的功能,它可以在需要时关闭所有的活动,以确保用户安全和数据安全。今天,我们将讨论如何使用 Kotlin 语言来实现强制下线功能。...
3. **全局广播实现被强制下线功能**:全局广播是Android系统的一种通信机制,可以跨进程传递消息。当服务器通知用户需要强制下线时,可以通过发送一个全局广播来接收此信息。首先,注册一个BroadcastReceiver来监听...
这个项目可能包含源代码、配置文件和相关文档,帮助开发者理解并实践强制下线的实现步骤。通过学习和分析这个项目,开发者可以了解如何在自己的应用中实现类似的机制,增强系统的安全性。 总的来说,"强制当前账号...
### C#小范例(强制QQ下线) #### 概述 本文将详细介绍一个简单的C#程序示例,该程序可以实现强制结束指定进程的功能,本例中为QQ进程。通过学习这一示例,读者不仅能了解如何在C#中操作进程,还能掌握如何通过...
很多应用程序都会有强制下线的功能,比如遇到账号异地登陆的情况,当前账号就会收到即将强制下线的提示。该功能的实现方法不难,本项目代码就实现了该功能.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调...
其实实现强制下线功能的思路也比较简单, 只需要在界面弹出一个对话框, 让用户无法进行其他操作, 必须点击对话框中的确定按钮, 然后回到登录界面即可. 但是又有一个问题, 我们通知用户强制下线, 用户可能正处于任何一...
这个事件可能是网络连接改变、应用退出或者特定的数据包到达等,这取决于你想要实现的强制下线逻辑。以下是一个简单的BroadcastReceiver示例: ```java public class ForcedLogoutReceiver extends ...
Android实现强制下线功能的示例代码 Android实现强制下线功能是Android应用程序中的一项重要功能,它能够强制用户退出当前账户,从而保护用户的账户安全。在本文中,我们将通过实例代码,详细介绍Android实现强制...