`

防止同一个账号在多台电脑登录

阅读更多
1.实现HttpSessionListener  接口对session 进行监听

package com.tms.listener;

import com.tms.bean.UserSession;
import com.tms.constant.SystemConst;
import com.tms.service.system.RedisCacheService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
* Created by gjp on 2017/10/19.
* 防止同一账号在多台机器上登录
*/
@Component
public class SessionListener implements HttpSessionListener {
    static final Logger logSession = LoggerFactory.getLogger(SessionListener.class);

    @Resource
    private RedisCacheService<String> redisCacheService;


    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
       HttpSession start = httpSessionEvent.getSession();

       logSession.info("createId={}",start.getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        String id =httpSessionEvent.getSession().getId();
        deleteById(id);

        logSession.info("destroyed session id:"+id);
    }

    public boolean isCheckRepeatUser(UserSession newSession,HttpSession session){
        boolean flag =false;
        Set<String> keys = redisCacheService.keys(SystemConst.REPEAT_USER_LOGIN+"*");
        if(null != keys){
            for(String item:keys){
                   if(!flag) {
                       String userId = redisCacheService.getRedisCache(item);
                       if (!StringUtils.isEmpty(userId)) {
                           if (newSession.getUserId().equals(userId) &&
                                   !(SystemConst.REPEAT_USER_LOGIN+session.getId()).equals(item)) {
                               int len = item.length();
                               String key = item.substring(SystemConst.REPEAT_USER_LOGIN.length(), len);
                               //用户重复
                               addRepeatUserId(userId, key, TimeUnit.HOURS);
                               flag = true;
                               break;
                           }
                       }
                   }
            }
        }

        addUserSession(session.getId(),newSession);

        return  flag;
    }

    /**
     * 添加已经重复Session
     * @param item 值
     * @param key 键
     * @param hours 小时
     */
    private void addRepeatUserId(String item, String key, TimeUnit hours) {
                redisCacheService.setRedisCache( SystemConst.REPEAT_USER_LOGIN_TRUE +key,
                item, 24, hours);
    }

    /**
     * 删除已经重复Session
     * @param sessionId
     */
     public void deleteRepeatUserId(String sessionId) {
        redisCacheService.deleteById(sessionId,SystemConst.REPEAT_USER_LOGIN_TRUE);
    }

    public String getRepeatUserId(final String sessionId){
         return  redisCacheService.getRedisCache(SystemConst.REPEAT_USER_LOGIN_TRUE+sessionId);
    }


    /**
     * 删除过期session
     * @param sessionId
     */
    public void deleteById(final String sessionId){
        redisCacheService.deleteById(sessionId,SystemConst.REPEAT_USER_LOGIN);
        redisCacheService.deleteById(sessionId,SystemConst.REPEAT_USER_LOGIN_TRUE);


    }

    private void addUserSession(final String sessionId,final UserSession session){
        redisCacheService.setRedisCache(SystemConst.REPEAT_USER_LOGIN+sessionId,session.getUserId(),
                24, TimeUnit.HOURS);
    }


}


2.当用户登录成功后,执行SessionListener 对象中的isCheckRepeatUser() 方法,
检查,并且标记是否有同一个账号在不同机器上登录的情况。

3.如果用户退出时,删除对应的sessionid 记录。

@Resurce
private SessionListener sessionListener;

@CheckSession(method = "LoginController.fgLogout")
    @RequestMapping("/logout")
    public ModelAndView fgLogout(){
        ModelAndView mav = new ModelAndView("/front/login");
        HttpSession session = getSession();
        Enumeration<String> enumeration = session.getAttributeNames();
        if(null != enumeration ) {
            while (enumeration.hasMoreElements()) {
                session.removeAttribute(enumeration.nextElement());
            }
        }


       sessionListener.deleteById(session.getId());
        return mav;
    }

分享到:
评论

相关推荐

    利用Flex技术实现消息通讯、账号重复登录、一台电脑只允许一个账号登录等问题

    本文将详细介绍如何利用Flex技术解决消息通讯、账号重复登录以及限制一台电脑仅允许一个账号登录等问题。 #### 一、消息通讯的实现 Flex是一种强大的客户端开发技术,它可以很好地处理多媒体内容,并且能够通过...

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

    本项目实现了一个特定的功能:确保同一账号在同一时间只能在一个地方登录,一旦有另一人在不同地点尝试登录,已登录的用户将被强制下线。这种设计模式被称为“会话独占”,它在许多在线服务中,特别是安全性要求较高...

    一个宽带账号让两台电脑同时上网的方法.docx

    随着互联网技术的发展和家庭网络需求的增长,越来越多的家庭面临这样的问题:如何利用一个宽带账号让多台设备(例如两台电脑)同时上网。这不仅涉及到硬件设备的选择与配置,还需要对网络连接有一定的了解。本文将...

    一台电脑同时登陆多个微信

    为了解决这个问题,我们可以利用特定的技术来实现在同一台电脑上同时登录多个微信。 本资源提供的压缩包包含了一个详细步骤的指南,教你如何在只安装一个微信客户端的前提下,实现电脑上同时打开并登录多个微信程序...

    小杯子免费电脑版本多开 一台电脑开多开微信

    标题中的“小杯子免费电脑版本多开 一台电脑开多开微信”指的是一个软件工具,允许用户在单台计算机上同时运行多个独立的微信客户端。这个功能对于需要管理多个微信账号,比如社交媒体营销人员、客服代表或者个人...

    AD域-限制windows域用户多点并发登录.docx

    AD域-限制windows域用户多点并发登录是指在Active Directory域中限制用户多点并发登录,以防止用户账号被盗用和不安全登录。通过创建GPO和脚本,可以实现用户登录限制,提高域安全性。 描述解释 限制Windows域用户...

    C#一个账号只允许一个人登录的程序

    这个程序的核心理念是确保同一时间只有一个用户能够使用特定的账号进行登录,防止了多个人同时操作同一账号的情况,增加了系统的安全性。 首先,我们需要理解这个程序的基本架构。它通常包含以下几个关键部分: 1....

    电脑端开启多个微信登录

    在电脑上同时开启多个微信登录是一项实用的技巧,尤其对于那些需要处理个人和工作微信,或者需要同时管理多个账号的用户来说。以下是如何在电脑端实现这一目标的详细步骤及相关的知识点: 首先,我们需要理解为什么...

    C#防用户重复登录的方法.NET

    当涉及到防止用户在同一台电脑上重复登录时,这是确保系统安全性和用户体验的重要环节。本篇文章将详细探讨如何在C#中实现这样的功能。 首先,我们需要理解为什么要防止用户重复登录。这主要是为了防止恶意用户通过...

    win7 如何设置Guest账号让你的电脑更安全.docx

    Win7 系统中,Guest 账号是一个重要的安全功能,它可以让其他人使用我们的电脑,而不需要使用我们的管理员账号,从而提高电脑的安全性。下面我们将介绍如何设置 Guest 账号让我们的电脑更安全。 设置 Guest 密码和...

    一台电脑只能投一次票的投票系统

    综上所述,"一台电脑只能投一次票的投票系统"涉及到的技术和原则涵盖了网络安全、身份验证、数据安全、防欺诈策略、系统架构和用户体验等多个方面。这样的系统设计旨在保证投票的公平性、可靠性和安全性。

    自动获取本机快带账号和密码

    这样的功能对于那些需要在多台电脑间同步网络设置或者需要备份重要网络信息的用户来说非常有用。 具体实现上,这类工具可能通过读取操作系统中的网络配置文件,或者利用Windows API接口来获取网络连接的相关信息。...

    微信电脑PC无限多开助手微信电脑多开器

    标题中的“微信电脑PC无限多开助手微信电脑多开...总的来说,微信电脑PC无限多开助手是一种针对特定需求的实用工具,它使得用户能够在同一台电脑上便捷地管理多个微信账号,但也需要用户谨慎使用,注意安全与合规问题。

    从Windows服务中使用不同账号启动进程

    在Windows操作系统中,服务是一种特殊的后台执行程序,它在用户登录之前或之后都可以运行,不受用户的交互影响。在某些情况下,我们可能需要从一个Windows服务中启动另一个进程,特别是当这个新进程需要特定用户权限...

    VMLogin防关联指纹浏览器,账号多开工具下载

    VMLogin可在同一个电脑上生成多个物理隔离并且防关联的反指纹浏览器,通过模拟电脑或手机设备的软硬件指纹信息,使得每个浏览器文件的Cookies、本地存储和其他缓存文件将被完全隔离,浏览器配置文件之间无法相互泄漏...

    IE 多开工具

    总的来说,IE多开工具是针对网页游戏用户设计的一款实用工具,通过它,用户可以轻松地在同一台电脑上同时管理多个IE浏览器窗口,从而在同一个网页游戏中同时登录并操作多个账号,提高游戏效率。不过,用户需要注意的...

    微信电脑版

    - 使用时注意网络环境的安全,避免在不安全的网络环境下登录,防止账号被盗。 微信电脑版的出现,极大地提升了用户在电脑上使用微信的便利性,特别是对于需要频繁处理工作文件和图片的用户,它提供了更高效、安全...

    怎样几台电脑共享一台打印机.docx

    【如何在多台电脑间共享一台打印机】 共享打印机是提高办公效率、节省资源的有效方法,尤其在小型办公室或家庭环境中非常实用。以下是详细步骤,帮助您实现多台电脑共享一台打印机。 **步骤一:安装打印机并设置为...

    建立隐藏windows不死账号

    在Windows操作系统中,有时出于特殊需求,用户可能会想要创建一个隐藏且“不死”的账号,即一个不会被系统轻易发现,并且即使系统出现问题也能保持活性的账号。本文将详细讲解如何在Windows系统中创建这样一个账号,...

    上网账号密码也可以保存在U盘里.docx

    本文档介绍了一种方便的方法,将上网账号...总的来说,该文档提供了一种创新的个人化登录解决方案,尤其适合经常在多台电脑间切换使用的人。然而,用户在使用时需谨慎对待账号安全,平衡便利性和保护个人信息的重要性。

Global site tag (gtag.js) - Google Analytics