单人登录-踢下线功能实现

  • 功能描述:

用户在不同会话层登录账号会将之前的账户状态注销,同一时间只有一个用户在线。

  • 实现:servlet+redis,

1.由于session的存储形式类似于key-value形式,则将其存储在redis中的hashmap较为合适。
2.redis中的hashmap只能存储string类型的键值对,因此将<username,sessionid>进行存储标识。
3.利用监听器进行每次session属性为user的监听动作

  • .1判断当前session请求为user的属性名后,获得sessionId
  • .2判断map集合中是否存在此user,
    若不存在-则将其直接加入到redis中的hashmap中,若存在-则将通过sessionId获取session对象将其属性移出
    此刻由于servlet版本问题,不支持通过sessionId获取session对象。因此我们要自己新建一个工具类SessionUtil来通过sessionId操作session,并建立一个监听器监听每个session的创建与销毁操作,使工具类同步 代码如下:
  • .3将最新登录的sessionId加入到redis中的hashmap中

3.2-监听器

package com.blog.listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;import com.blog.util.SessionUtil;/***当创建 user的session时将其加入到sessionutil工具类中的map集合中进行同步*/
@WebListener
public class SessionListener implements HttpSessionListener {//创建session时将其加入public void sessionCreated(HttpSessionEvent se)  { SessionUtil.addSession(se.getSession());}/*** @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)*///销毁session时将其从map中删除public void sessionDestroyed(HttpSessionEvent se)  { SessionUtil.deleteSession(se.getSession());}}

3.2-SessionUtil工具类

package com.blog.util;
//工具类SessionUtil 通过sessionId操作session
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpSession;public class SessionUtil {//创建map存放sessionid、sessionprivate static Map<String,HttpSession> map = new HashMap<>();//添加sessionpublic static void addSession(HttpSession session) {if(session!=null) {map.put(session.getId(), session);}}//移除sessionpublic static void deleteSession(HttpSession session) {if(session!=null) {map.remove(session.getId());}}//通过sessionid获得sessionpublic static HttpSession getSession(String id) {HttpSession session = null;if(id!=null) {session = map.get(id);}return session;}}

3-监听session属性:

package com.blog.listener;import java.util.Map;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;import com.blog.entity.User;
import com.blog.util.RedisUtil;
import com.blog.util.SessionUtil;
import com.google.gson.Gson;import redis.clients.jedis.Jedis;/*** 通过监听sessionattribute实现单点登录*  将sessionid存储到redis数据库中*/
@WebListener
public class Loginlistener implements HttpSessionAttributeListener {public Loginlistener() {// TODO Auto-generated constructor stub}/*** @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)*/public void attributeAdded(HttpSessionBindingEvent arg0)  { if(arg0.getName().equals("user")) {//通过工具类获得jedis对象Jedis jedis = RedisUtil.getredis();//获得当前session中user对象User u = (User)arg0.getValue();//获得redis数据库中的map对象Map<String,String> map = jedis.hgetAll("session");String name_key = u.getUsername(); //获得map中的key值//将sessionid 存入redis 数据库String sessionid = arg0.getSession().getId();  //获取当前登录的sessionid//判断用户是否已经登录if(map.containsKey(name_key)) {//获得之前客户端sessionidString pre_sessionid = map.get(name_key);//移出之前登录的  销毁sessionHttpSession pre_session = SessionUtil.getSession(map.get(name_key));pre_session.removeAttribute("user");map.remove(name_key);}//用户未登录,将当前用户放进session 及 map中jedis.hset("session", u.getUsername(), sessionid);}}/*** @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)*/public void attributeRemoved(HttpSessionBindingEvent arg0)  { // TODO Auto-generated method stubSystem.out.println("attributeRemoved");}/*** @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)*/public void attributeReplaced(HttpSessionBindingEvent arg0)  { // TODO Auto-generated method stubSystem.out.println("attributeReplaced");}}

单人登录-踢下线功能实现相关推荐

  1. 仿QQ异地登录强制下线功能的实现

    一,仿QQ异地登录强制下线功能 效果:同一个账号,最后一个登录的用户会把前一个登录后的用户顶掉,被迫下线! 1,剖析登录原理 登录的后台逻辑 准备一张账户信息表(账号,密码,是否禁用等字段) 查询账号 ...

  2. JavaWeb-实现多ip、异地 同时登录踢人下线

    所用知识点罗列: cookie .session.serverlet过滤器.serverlet监听器,前提环境是基于Session实现的登录功能 (Session中存放了登录者的ip,userName ...

  3. Java用Filter制作登录限制-踢下线防踢等

    Hello, 我是Shendi, 这次我给大家带来了 JavaWeb登录 限制登录 防踢  挤下线的功能实现 如题,很简单,我们需要编写一个Filter,就叫LoginFilter  实现javax包 ...

  4. java怎么实现踢掉在线用户_Java多人在线聊天室(3)— 踢人下线功能

    作为一个聊天室,肯定会有很多人在里面聊天,那么要是有人里面捣乱怎么办?直接踢人不解释. 我们在创建数据库的时候就有这样的考虑,所以我们的账户有两种,一种是管理员,一种是普通用户. 打开的数据库!我们可 ...

  5. Android 集成环信实现单点登录校验,账号异地被挤下线功能。

    前言 其实所说的被挤下线功能,就是一个账号在A客户端保持登陆状态,然后又在B客户端进行了登陆操作,那么A客户端就会被顶下线 很多伙伴在开发自己公司产品的时候,一般都会考虑用户账号安全,或者用户账号功能 ...

  6. Android单点登录,互踢下线代码实现

    Android单点登录,互踢下线代码实现 分享一个在项目中必然会用到的小功能--单点登录,也就是我们常说的互踢下线. 国际惯例,先上效果图 一.先说逻辑,其实挺简单 ​ 首先,对于监听账号是否在其他设 ...

  7. 单用户登录记录互踢下线思路

    单用户登录记录(只谈redis实现) 用户登录成功生成随机值(uuid或者雪花算法,随意)存在redis(假设key="token-user:token",值="user ...

  8. java强制下线 session,登录的多地挤下线功能 redis session

    使用redis储存session 使用redis 存储 信息 和本地session 做比较 如果相同 表明是同一次登录 如果和redis不同 表明不是同一次登录 强制下线即可 req.headers. ...

  9. Android 端“被挤下线”功能的实现 2017-11-15 sun_____xin code小生 作者 | sun_____xin 地址 | http://www.jianshu.com/p/

    Android 端"被挤下线"功能的实现 2017-11-15 sun_____xin code小生 作者 | sun_____xin 地址 | http://www.jiansh ...

最新文章

  1. 使用工作集(Working Set)整理项目
  2. Linux Swap空间利用率过高
  3. SRAM(静态随机存储器)
  4. 吉林大学计算机科学与技术学院王欣,应用改进迭代最近点方法的点云数据配准...
  5. Median(POJ-3579)
  6. FF公布融资及FF 91交付规划 IPO之前还需8.5亿美元资金
  7. mysql附加数据库失败_我的数据库为什么附加不上去?
  8. networkx怎么显示图_如何将标签添加到networkx图形中的节点?
  9. 斯坦福大学深度学习公开课cs231n学习笔记(9)softmax分类和神经网络分类代码实现
  10. 为什么我电脑的所有浏览器都开不了网页
  11. 英伟达驱动怎么设置显示帧数?
  12. win7 用 Activation激活 重启 进入 Acer eRecovery Management 解决办法
  13. usb大容量储存设备感叹号?USB大容量存储设备无法启动
  14. 金融量化分析【day112】:量化平台的使用-第一个策略
  15. 110001 《创业的旅途》读后感——坚持梦想,虔诚对待,相信生命的奇迹
  16. uniapp app真机测试
  17. 基于Python SimpleHTTPServer.py的修改脚本:HTTP文件服务器,修正中文目录列表,支持视频文件在线播放
  18. [机器学习]随机森林源码(python)
  19. 送书 | 教你下载B站指定视频
  20. HZNU1883CCJ的直线化简

热门文章

  1. go语言工作目录都有什么?GOPATH下的目录结构
  2. 计算机中丢失d3dx941,d3dx9_41.dll(支持64位)
  3. 数字艺术藏品系统开发
  4. 如何解决Win11系统显示你的账户已被停用
  5. Infragistsitcs NetAdvantage WebCombo 控件
  6. Mysql输错命令后如何退出
  7. 古人诚不欺我-南怀瑾大师
  8. Mysql中大于、大于等于、小于、小于等于的写法
  9. 2015-06-17
  10. oa项目环境搭建的操作步骤详解