`
lbyzx123
  • 浏览: 481947 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

限制同一个会话只允许一个账号登录,针对ie7、e8多标签同一会话问题

    博客分类:
  • J2EE
 
阅读更多

package com.anxiesoft.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

public class SessionFilter implements Filter {
 private Map<String,Long> sessions;
 private String loginedCode; 
 LogHelper log = new LogHelper(this.getClass());

 @Override
 public void destroy() {
  log.info("..........destroy..............");
  if (sessions != null) {
   sessions.clear();
   sessions = null;
  }
 }

 @Override
 public void doFilter(ServletRequest req, ServletResponse resp,
   FilterChain chain) throws IOException, ServletException {
  HttpServletRequest request = (HttpServletRequest) req;
  HttpSession session = request.getSession();
  String sessionId = session.getId();
  String url = request.getRequestURL().toString();
  String queryString = request.getQueryString();
  Map parameterMap = request.getParameterMap();
  log.info("来自Ip[" + request.getRemoteAddr() + "]的sessionId:" + sessionId);
  RequestDispatcher dispatcher = request.getRequestDispatcher("/admin/util/session.jsp");
  if (StringUtils.isNotEmpty(url)) {
   if (url.contains("/admin/login.do")) {
    if ("act=logout".equals(queryString)) {
     sessions.remove(sessionId);
     chain.doFilter(req, resp);
     return;
    }
    if (parameterMap.size() == 0) {
     chain.doFilter(req, resp);
     return;
    }
    if (parameterMap.size() == 4) {
     Long logintime = NumberUtils.toLong(request.getParameter("logintime"));
     if (!sessions.containsKey(sessionId)) {
      sessions.put(sessionId,logintime);
      loginedCode = (String) session.getAttribute(Constants.SESSION_VERIFYCODE);
      chain.doFilter(req, resp);
      return;
     } else {
      if (UsersSession.getInstance().getUserid(request) == null) {
       sessions.remove(sessionId);
       chain.doFilter(req, resp);
       return;
      }else{
       Long sessionLoginTime = sessions.get(sessionId);
       if(sessionLoginTime.intValue()==logintime.intValue()){
        chain.doFilter(req, resp);
        return;
       }else{
        session.setAttribute(Constants.SESSION_VERIFYCODE, loginedCode);
        dispatcher.forward(req, resp);
        return;
       }
      }
     }
    }
   } else {
    chain.doFilter(req, resp);
    return;
   }
  } else {
   log.error("web服务器崩溃。。。");
  }
 }

 @Override
 public void init(FilterConfig arg0) throws ServletException {
  log.info("..........init..............");
  sessions = new HashMap<String,Long>();
 }

}
 
表单提交时,需要提交用户名、密码、验证码、登录时间共4个参数。

 

分享到:
评论

相关推荐

    同一个账号,同一时间只能允许他登录一次

    在IT行业中,"同一个账号,同一时间只能允许他登录一次" 这个需求通常被称为单点登录(Single Sign-On, SSO)。这是一个重要的安全性措施,防止用户账户被多个设备或不同地点同时使用,以增加系统的安全性,防止未经...

    一个账号同一时间只能登录一次

    "一个账号同一时间只能登录一次"的功能,通常被称为单点登录(Single Sign-On,简称SSO),它能够防止恶意用户同时在多个设备或浏览器会话中登录同一个账号,确保了用户的账户安全。下面将详细讲解如何实现这一功能...

    防止同一账号多个用户同时登陆的解决方法.txt

    3. **处理登录冲突**:一旦检测到同一账号在不同位置尝试登录,系统会将之前的登录状态`Login_status`设置回0,强制下线之前的登录会话,从而确保同一账号在同一时间只能在一个地方登录。 #### 利用ASP.NET管理登录...

    PHP 实现一个账号仅允许一个用户登陆

    本次我们关注的话题是如何实现一个账号仅允许一个用户登录的功能,这通常涉及到会话管理、数据库交互以及用户验证等多个关键点。这个功能对于提高系统的安全性至关重要,避免了同一账号在多个设备或浏览器同时登录,...

    C#两个账号同时登录,后登录的账号将前一个账号挤掉

    在C#编程中,"同一个账号只能登录一次"的需求是一个常见的多用户系统设计规范,它旨在确保用户账户的安全性和系统的一致性。当一个账号在一处登录后,其他地方的同一账号尝试登录时,系统应该拒绝该请求或者强制结束...

    J2EE限制同一账号同一时刻只能一个用户登录使用,向QQ一样

    总之,实现“J2EE限制同一账号同一时刻只能一个用户登录使用”是一个涉及会话管理、安全性、用户体验等多个方面的综合任务。通过合理的架构设计和技术选型,我们可以构建出高效且安全的单点登录系统。

    在线聊天室。实现了同一个帐号同一时间在不同地点只能一个人登录,如果一个人使用则另一个人被迫下线

    3. **会话管理**:一旦用户成功登录,就需要创建一个会话,并将这个会话标识(如Session ID)保存在服务器端和客户端的Cookie中。当用户尝试在另一个设备上登录时,服务器首先检查当前账号是否已有活动会话,如果有...

    同一账号禁止多人同时登陆

    1. **会话管理**:服务器端记录每个登录的用户会话,当同一账号的新登录请求到来时,会结束旧的会话,确保只有一个活跃会话存在。 2. **令牌验证**:使用JWT(JSON Web Token)或其他类型的令牌进行身份验证,每次...

    利用spring security控制同一个用户只能一次登陆

    标题中的“利用Spring Security控制同一个用户只能一次登录”是指在基于Spring Security的Web应用程序中实现单点登录(Single Sign-On, SSO)的功能,确保同一时间只有一个设备或浏览器会话可以登录同一用户的账户。...

    怎么避免一个账号多处同时登录

    ### 如何避免一个账号在多处同时登录 在企业级应用系统中,特别是像OA(Office Automation System,办公自动化系统)这样的系统里,确保账户安全是至关重要的。本篇文章将详细探讨如何通过修改配置文件来避免一个...

    Asp.net中实现同一用户名不能同时登陆

    例如,在银行系统或者一些重要的管理系统中,如果允许同一个账户在不同终端同时登录,可能会导致数据泄露或其他安全问题。因此,限制同一用户账户在同一时间只能在一个地方登录是非常必要的。 #### 二、实现原理及...

    限定同一用户名同一时间登录个数的解决方案收藏

    2. 如果验证通过,将用户ID和允许的登录个数传递给一个函数,例如`LoginSum`。 3. 在`LoginSum`函数中,查询`Login`表中对应用户ID的记录数。如果记录数小于`User_LoginSum`,则可以创建新的登录记录,更新`Login_...

    解决Windows Server 2008 R2 远程桌面每个用户只能进行一个会话

    因此,本文将详细介绍如何解除Windows Server 2008 R2 远程桌面服务中对每个用户仅限一个会话的限制,从而实现多用户共享账户登录的需求。 #### 操作步骤 1. **打开远程桌面服务管理器** - 首先,登录到运行...

    同一账号不能同时登陆

    在IT行业中,尤其是在开发Web应用时,经常遇到“同一账号不能同时登录”的需求。这个需求主要是为了保护用户的安全,防止他人盗用账户或者避免多个人同时操作同一个账号导致的数据混乱。下面将详细解释两种实现这一...

    IE8浏览器如何实现多用户登录同一网站?.docx

    在旧版本的Internet Explorer(如IE7和IE6)中,这是一项挑战,因为这些浏览器只能存储一个特定网站的Cookie,导致切换账户时需要频繁登录和注销。然而,随着IE8的推出,这一问题得到了解决。IE8引入了一项名为...

    filter过滤器实现权限访问控制以及同一账号只能登录一台设备

    在Web开发中,权限访问控制和用户...总的来说,通过`Filter`实现权限访问控制和同一账号登录限制,既增强了系统的安全性,又优化了用户体验。开发者可以根据具体需求灵活设计过滤逻辑,以满足不同业务场景的安全要求。

    突破Windows终端服务器只允许至多2个并发会话连接限制

    突破Windows终端服务器只允许至多2个并发会话连接限制。

    同一账号不能多地登录

    在IT行业中,尤其是在开发Web应用时,"同一账号不能多地登录"是一个常见的需求,它涉及到用户账户的安全性和系统资源管理。这个Demo展示了如何通过Java编程语言实现这一功能,特别是利用了Session技术。以下是对这个...

Global site tag (gtag.js) - Google Analytics