JavaWEB项目实现一个账号不能同时登录,即控制并发登录的实现

JavaWeb快速入门(二)——实现登录页面 (一)静态登录页面我们在https://blog.youkuaiyun.com/qq_35616167/article/details/80917262的基础上,继续对javaweb项目进行操作,以熟悉javaweb。在项目工程下的WebRoot文件夹下,为使得项目清晰,我们可以分别新建文件夹css、js、img以存放html所需的css等。我们把https://blog.youkuaiyun.com/qq_3... 阅读详情

以前第一次遇到这个问题,求这个问那个,不知道的帮不了你,知道的不告诉你(因为他们太大牛,不屑与你),受尽了气。所以还是得自己提高自己,不要想着把别人当资源,而是把自己变成别人的资源。

好了,抱怨结束,开始正事,实现思路如下:

新建一个filter,对全局所有请求进行过滤;

filter里面获取application,使用application存储username,Deque的键值对,Deque中存放sessionId;

每次经过这个过滤器,在过滤方法中使用application根据username获取Deque,把新生成的sessionId存入进去,之后判断Deque的size,如果大于1,则移除新加之外的所有sessionId,使用remove方法是接收返回值,这个返回值即是旧登录地点的sessionId,根据这个sessionId创建一个session,给这个session设置一个键值对(“是否异地登录”,true),

最后,在过滤方法来进行一个判断,如果当前session的“是否异地登录”为true,那么过滤器返回false,提示异地登录

示例代码参考地址:http://jinnianshilongnian.iteye.com/blog/2039760

package cn.filter;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

import java.util.Deque;
import java.util.LinkedList;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class KickoutFilter extends AccessControlFilter {

	private String kickoutUrl; // 踢出后到的地址
	private SessionManager sessionManager;

	public String getKickoutUrl() {
		return kickoutUrl;
	}

	public void setKickoutUrl(String kickoutUrl) {
		this.kickoutUrl = kickoutUrl;
	}

	public SessionManager getSessionManager() {
		return sessionManager;
	}

	public void setSessionManager(SessionManager sessionManager) {
		this.sessionManager = sessionManager;
	}

	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
			throws Exception {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		Subject subject = getSubject(request, response);
		if (!subject.isAuthenticated() && !subject.isRemembered()) {
			// 如果没有登录,直接进行之后的流程
			return true;
		}
		String username = (String) subject.getPrincipal();
		Session session = subject.getSession();
		String sessionId = (String) session.getId();

		HttpServletRequest req = WebUtils.toHttp(request);
		ServletContext application = req.getSession().getServletContext();
		Deque<Object> deque = deque = (Deque<Object>) application.getAttribute(username);
		if (deque == null) {
			deque = new LinkedList<>();
			deque.push(sessionId);
			application.setAttribute(username, deque);
			return true;
		}
		if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) {
			deque.push(sessionId);
		}
		System.out.println(sessionId);
		System.out.println(deque.contains(sessionId));
		System.out.println(session.getAttribute("kickout"));
		System.out.println();
		for (Object object : deque) {
			System.out.println(object.toString());
		}
		System.out.println();
		System.out.println();
		System.out.println();
		while (deque.size() > 1) {
			String kickSessionId = (String) deque.removeLast();
			System.out.println(kickSessionId);
			System.out.println();
			System.out.println();
			System.out.println();
			if (kickSessionId != null) {
				Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickSessionId));
				if (kickoutSession != null) {
					kickoutSession.setAttribute("kickout", true);
				}
			}
		}
		if (session.getAttribute("kickout") != null) {
			subject.logout();
			saveRequest(request);
			req.setAttribute("kickMsg", "该账号异地登录,您被强制下线");
			WebUtils.issueRedirect(request, response, kickoutUrl);
			return false;
		}
		return true;
	}

}

 

 -----------------------------------分割线------------------------------------

 2019年12月5日:

最近看项目的代码我想到了这篇博客,特来记录一下现在的我实现这个功能的思路:

1.创建缓存类,有两个全局map。

   map1存储token和用户对象,

   map2存储用户对象id和token。

2.每次登录生成token,规则:当前时间戳+用户id(确保每次不一样)。

3.请求服务器的时候对请求参数token进行验证

   a.根据缓存的map1获取用户对象,对象不存在返回前端登录无效;

   b.map2根据token拿到的用户,用用户id拿出再拿token;

   c.判断map2拿到的token和前端传递的tokne,两者一致则为单用户,正常执行,否则返回前端异地登陆

 

ps:这种方式可以确保后者登录挤掉前者。如果服务集群token存储在redis

JavaWeb使用百度人工智能API实现人脸识别登录,人脸注册 1.JavaWeb使用百度API实现人脸识别 本篇博客使用的环境是SSM+Maven+JSP实现人脸识别登录,适合于JavaWeb的开发,我会从注册百度云账号到分析图片详细的解说。 代码方面分别通过两个部分来实现 1.前台摄像头调用使用Ajax将图片转换为Base64格式到SSM后台 2.再调用百度提供的接口对图片进行分析 3.最终的效果就是输入账号在对人脸进行识别登录 1.首先第一步就是需要注... 阅读详情

相关推荐

Linux中使用宝塔面板部署javaWeb项目

最近在centos7.2上使用宝塔面板部署javawe项目,首次使用宝塔面板,在网上找的资料很少不全。。。不说的我们开始 1、使用putty进入Linux就不多说了 2、进入宝塔官网https://www.bt.cn/ 3、点击立即安装 4、根据自己需求选择要安装的版本,这里一centos7.2 为例安命令:yum install -y wget &amp;amp;amp;&amp;amp;amp; wget -O ...

qq_33481812的博客 4万+

java只用7行代码实现“同一账号不能重复登录”

我们平时登录qq时,如果已经登录,则会提示不能重复登陆。 可以在登陆时获取当前用户的sessionId ServletContext application = session.getServletContext(); String sessionId = (String) application.getAttribute(user.getUsername()); //获取登录用户的 sessionId if (sessionId!=null && !"".e

sinat_40482939的博客 1562

JavaWeb小米登录系统项目实战(Eclipse版)

Servlet是一个Java类,它实现了接口。通过继承类,开发者可以快速创建处理HTTP请求的Servlet。Servlet的主要作用包括:接收HTTP请求(GET、POST等)处理业务逻辑(如数据库查询、数据处理)向客户端发送响应(HTML页面、JSON数据等)

weixin_30653091的博客 877

java web实现同一账号同一时间只能在一个地方登录

网上看了很多方法,个人也看了,自己也总结了几个比较常用的:           前提都是用session监听器,对session的创建与销毁进行监听       一、在用户登录时保存该用户的状态有这几种保存方式:          1、保存到内存中(application ,servletcontext ,个人也是推荐这种方式)          2、保存状态到数据库,至于具体的怎么保存你

idleneedy的专栏之我是sb 5141

Java同一账号限制同时登录

Java实现同一账号限制同时登录,里面是源码,写得很清楚。利用application实现的,入门选手的福利

Java Web开发防止多用户重复登录的完美解决方案

在web项目开发中,很多情况下都可以让同一个账号信息在不同的登录入口登录很多次,这样子做的不是很完善。一般解决这种情况有两种解决方案,小编呢主要以第二种方式给大家介绍具体的实现方法,对java web 防止多用户重复登录的解决方案感兴趣的朋友一起看看吧

java 不允许同一账户不同IP 同时登录系统解决办法 兼容IE Firefox

java 解决 不允许用户同时登录系统 不同ip 不同浏览器 ie firefox 轻松解决。

hejiakuo的专栏 3251

Java 多用户登录限制的实现方法

最近没有事情做,闲的发呆,于是写个东东练练手。这篇文章主要介绍了Java 多用户登录限制的实现方法的相关资料,需要的朋友可以参考下

单页面应用多个账号登录问题

前提:前端项目中用了很多本地缓存,后端是通过SESSION会话识别账号,一个账号登录后在新窗口再登录其他账号会导致SESSION被覆盖,从而导致前面账号数据显示后面账号的,数据会串。 解决方案: 1.token,后端说他们没有用token不好弄给排除了 2.前端自己处理,登录前先做登出操作,保证只存在一个SESSION会话;前端登录后会利用本地缓存特性自己鉴定SESSION属于哪个账号的,不是这个账号的退出到登录页面。 具体操作: 由于项目的特殊性,不能让多个账号同时操作,所以在用户登录的时候将用户id分别

qq_27175079的博客 2900

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

别再死记硬背了!用‘小乌龟’实战图解ROS1核心指令(rosnode/rostopic/rosparam保姆级手册)

本文通过经典的turtlesim乌龟仿真器,以可视化实战方式讲解ROS1核心指令(rosnode/rostopic/rosparam),帮助初学者摆脱死记硬背,在操控乌龟的过程中轻松掌握节点管理、话题通信和参数设置等ROS1核心概念。

weixin_28731223的博客 371

JavaWeb之使用Servlet+MySQL实现简易登录注册功能

本文是使用Servlet+MySQL开发,实现登录注册功能,javaweb是一门知识较多的科目,我的文章里没有太多理论体系,适合基础较弱的同学,非常容易上手,本文为javaweb入门学习 目录一、创建数据库表二、创建前端页面1. 登录界面2.注册界面三、后端数据处理1.创建并测试servlet接收前端请求2.登录与注册注册 提示:以下是本篇文章正文内容 一、创建数据库表 这里我们创建一个数据库名为JavaWeb,创建库的使用可视化工具很简单就不细说了,下面sql代码块是我们创建一个简易用户表为了方便我们

qinnt的博客 1万+

别再一个个BAPI调了!用CVI_EI_INBOUND_MAIN一次性搞定SAP BP主数据(附完整ABAP代码)

本文详细介绍了如何使用SAP标准函数CVI_EI_INBOUND_MAIN高效维护业务伙伴(BP)主数据,替代传统的多BAPI调用方式。通过完整ABAP代码示例,展示了如何一站式处理供应商、客户、公司代码等所有视图的创建与更新,提升数据一致性和开发效率。

weixin_29204205的博客 300

javaweb 禁止账号重复登录,后登录账号踢掉之前登录账号

功能目标: 账号在其他地方登录后,当前登录账号被迫下线 步骤: 1、新建两个全局map //session map,用以实现挤掉相同账号 //key:登录账号;value:session对象 public static Map<String, HttpSession> SESSION_MAP = new HashMap<String, HttpSession>(...

cndn20120225的博客 1325

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 234

ubuntu打实时内核补丁教程以及安装后显卡驱动问题解决方法

在ubuntu20.04上安装成功,亲测有效 目录ubuntu打实时内核补丁教程1、下载实时内核2、解压和打补丁(patch)3、安装依赖和编译安装4、修改一些文件,便于之后切换内核5、重启电脑实时内核版本下安装nvidia显卡驱动的问题1、先切换回之前的内核(非实时)版本2、重装之前内核(非实时)版本下的显卡驱动3、切换回实时内核(按照上面的步骤)4、在实时内核下安装显卡驱动 ubuntu打实时内核补丁教程 安装目标系统:ubuntu20.04 电脑配置:i9,2080ti 1、下载实时内核 打开终端,输

weixin_39275295的博客 7996

学生选课系统(一个JavaWeb必掌握项目)

1、假设:后端设计数据库中账号字段的时候,有规律可循: 管理员:1001开头 1001001、1001002 老师:2001开头 2001001、2001002 老师:3001开头 3001001、3001002 2、假设:后端设计数据库中账号字段没有规律,此时需要添加一个登录类型:

让Java学习变得简单 1万+

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 809

java登录总掉_javaweb 禁止账号重复登录,后登录账号踢掉之前登录账号

功能目标:账号在其他地方登录后,当前登录账号被迫下线步骤:1、新建两个全局map//session map,用以实现挤掉相同账号//key:登录账号;value:session对象public staticMapSESSION_MAP=newHashMap();//登录用户被挤掉后存放提示消息//key:sessionId;value:提示消息public staticMapMSG_MAP=new...

weixin_39574708的博客 330

YOLO26涨点改进 | 独家创新,特殊场景检测篇 | TGRS 2025 | 引入FAENet特征自适应增强网络,专注于恶劣天气条件下的目标检测(低光场景、雾天场景、雨雪场景、复杂环境等)即插即用

🔥本文提出了一种名为FAENet的特征自适应增强网络,可有效提升YOLO26在恶劣天气条件下的目标检测性能。FAENet通过拉普拉斯金字塔分解思想,将输入特征分为低频和高频两部分进行针对性增强:低频分支强化全局轮廓,高频分支增强边缘纹理细节。该模块设计轻量、可端到端训练,在不改变原始图像分布的前提下,显著缓解雾霾、低照度等复杂环境造成的特征退化问题。实验表明,该方法在多个恶劣天气数据集上超越了当前最优检测器,同时保持了轻量级和高速度特性。

Ai缝合怪、助力小伙伴高效发论文 336

python基础知识补充

1. jupyter notebook 解释 2. ipython 魔法命令 3. latex in Markdown cell(在markdown里面编写数学公式) 4. jupyter notebook功能扩展:安装Nbextension 5. python解释与运行 6. 垃圾回收(计数机制与分代回收机制) 7. 名字空间与局部作用域L和全局作用域G 8. 小整数缓存区与字符驻留 9. Statement &Expression 10. 调试

weixin_43178406的博客 1万+

【JavaWeb期末项目】简单的同学录系统

同学录系统,简单的界面增删改查功能,附有完整代码以及源码可以运行和下载。

zoetu 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java web过滤器实现账号单一登录,防止同一账号重复登录,踢人效果

实现了Java web开发账号单一登录的功能,防止同一账号重复登录,后面登录的踢掉前面登录的,使用过滤器Filter实现的。可以先下载项目下来测试下效果。 有博客写的是没个一段时间(比如500ms)读取后台的session,这种方法除了会占用资源,还会出现访问session(请求1)的返回值和自己提交请求(请求2)的返回值发生冲突。比如请求1先提交,此时请求1的返回值还未返回到前端,请求2提交,实际上我们想要的是请求1的返回值先返回,然后再...

qq_34826261的博客 2492

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

javaweb项目

源码:(百度网盘) 链接:JavaWeb 提取码:3xf9 链接: Oracle数据库文件 提取码:vkko 说明: 不希望大家复制粘贴、交作业,一气呵成,动作行云流水。而是希望看下面的讲解,学会自己设计一个JavaWeb项目。可能有些地方会讲解不好, 大家自行纠正,界面不美观请见谅,没有美术细胞(pao)--’’’。 发这篇博客的原因是:不说了 心酸(>< )已哭晕在厕所… 数据库不唯一,更换mysql 更换mysql-jdbc ,建库建表,修改util 即可。 ​ 讲解: ​ 环境

LJCC_c的博客 9108

java web项目 登录_手把手教你做JavaWeb项目:登录模块

现如今,无论是客户端还是移动端,无论是游戏登陆还是社交平台登陆,无处不在的“登陆”。那么你知道怎么制作吗?今天就为你娓娓道来:用户登录在各大信息管理系统中,登录功能是必不可少的,他的作用就是验证用户的身份,判断用户是否是本站的会员,只有会员才能访问当前系统登录的实现步骤:1.用户填写账号和密码,提交到后台2.后台获取到账号和密码后,将其发送到数据库中进行查询3.查询结果如果为null,说明用户填写...

weixin_36182226的博客 1521

JavaWeb登录注册页面

JavaWeb登录注册页面 去发现同类优质开源项目:https://gitcode.com/ 项目简介 本项目是一个基于JavaWeb的小型示例,实现了用户登录与注册的核心功能。特别地,它包含了如下高级特性: 验证码生成与验证:确保账户的安全性,防止自动脚本的恶意登录尝试。 记住账号密码:通过cookie或session技术,为用户提供便利,自动填充之前的登录信息。 ** Filter拦截器**...

gitblog_09812的博客 1055
上一篇: git bash 命令行上传本地代码至github
下一篇: 解决火狐浏览器使用easyUI生成的panel不在页面中间,而在页面上方,且部分被遮挡
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值