java 单一登录

2023-10-29

对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现:

1 .在用户登录时,把用户添加到一个ArrayList中

2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录

3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况

① 使用注销按钮正常退出

② 点击浏览器关闭按钮或者用Alt+F4退出,可以用javascript捕捉该页面关闭事件,

执行一段java方法删除ArrayList中的用户

③ 非正常退出,比如客户端系统崩溃或突然死机,可以采用隔一段时间session没活动就删除该session所对应的用户来解决,这样用户需要等待一段时间之后就可以正常登录。

在LoginAction中定义:

// 用来在服务器端存储登录的所有帐号

public static List logonAccounts;

login() 登录方法中:

// 设置session不活动时间为30分

request.getSession().setMaxInactiveInterval(60*30);

if(logonAccounts==null){

logonAccounts = new ArrayList();

}

// 查看ArrayList中有没有该用户

for (int i = 0; i < logonAccounts.size(); i++) {

Account existAccount = (Account)logonAccounts.get(i);

if(account.getAccountId().equals(existAccount.getAccountId())){

    return "denied";

}

}

// 在用户登录时,把sessionId添加到一个account对象中

// 在后面 ③ 需要根据此sessionId删除相应用户

account.setSessionId(request.getSession().getId());

// 该用户保存到ArrayList静态类变量中

logonAccounts.add(account);

return “login”;

① 使用注销按钮正常退出

logout() 退出方法中:

if(logonAccounts==null){

logonAccounts = new ArrayList();

}

// 删除ArrayList中的用户 ⑴

for (int i = 0; i < logonAccounts.size(); i++) {

Account existAccount = (Account)logonAccounts.get(i);

if(account.getAccountId().equals(existAccount.getAccountId())){

    logonAccounts.remove(account);

}

}

② 点击浏览器关闭按钮或者用Alt+F4退出:

在后台弹出一个窗口,在弹出窗口中删除ArrayList中的用户

function window.onbeforeunload(){

// 是否通过关闭按钮或者用Alt+F4退出

// 如果为刷新触发onbeforeunload事件,下面if语句不执行

if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){

    window.open('accountUnbound.jsp','',

            'height=0,width=0,top=10000,left=10000')

}

}

accountUnbound.jsp : 弹出窗口中删除ArrayList中的用户

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 单一登录 的相关文章

随机推荐

  • 启动sonarqube 报错 AccessDeniedException: /opt/module/sonar/sonarqube-7.5/temp/conf/es/elasticsearch.yml

    报错信息 WrapperSimpleApp Encountered an error running main java nio file AccessDeniedException opt module sonar sonarqube 7
  • vue的拖拽插件: vue.draggable

    中文文档地址 vue draggable中文文档 itxst comVue Draggable是一款基于Sortable js实现的vue拖拽插件 支持移动设备 拖拽和选择文本 智能滚动 可以在不同列表间拖拽 不依赖jQuery为基础 vu
  • 2023-2024最新python毕业设计选题推荐大全

    文章目录 0 前言 1 python 算法类 毕设选题 2 python 数据挖掘 毕设选题 3 python 大数据处理 云计算 区块链 毕设选题 4 python 网络安全 毕设选题 5 python 游戏设计 动画设计类 毕设选题 适
  • LeetCode 7. 整数反转

    题目链接 7 整数反转 注意题目已经更改为不允许存储 64 位整数 有符号或无符号 class Solution public int reverse int x int total 0 while x if total gt 0 tota
  • H5项目怎么打包成APP

    文章目录 前言 一 新建5 APP项目 二 删除不需要的文件 三 将H5打包的文件拷贝到当前目录下 四 配置APP 五 发行 云打包 六 安装apk 总结 前言 开发uni app的编辑器HBuilderX可以将H5项目打包成APP 相信很
  • 牛客SQL大厂面试真题目录

    1 某音短视频 SQL156 各个视频的平均完播率 SQL157 平均播放进度大于60 的视频类别 SQL158 每类视频进一个月的转发量 率 SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量 SQL160 国庆期间每类视频点赞量和
  • etc的常见算法_ETC面试题总结.doc

    ETC面试题总结 ETC 面试 ETC 面试1 一 测试2 二 UNIX4 三 Oracle7 四 智能网方面10 五 C 方面11 六 网络13 七 操作系统16 八 数据结构17 九 其它19 测试 软件在开发过程中的测试流程 讲一下软
  • Sublime Text 3配置Go语言开发环境

    Sublime Text 3配置Go语言开发环境 1 Go语言环境搭建 2 GoSublime安装和配置 2 1 安装步骤 2 2 代码开发 2 3 编译运行 1 Go语言环境搭建 本篇博文是在读者Go自身环境已经搭好 Sublime Te
  • 华为OD机试 - 求最小步数(Java)

    题目描述 求从坐标零点到坐标点n的最小步数 一次只能沿横坐标轴向左或向右移动 2 或 3 注意 途径的坐标点可以为负数 输入描述 坐标点n 输出描述 输出从坐标零点移动到坐标点n的最小步数 备注 1 lt n lt 10 9 用例 输入 4
  • 解决Shiro jwt并发刷新token问题

    使用shiro jwt做应用系统的权限校验 网上通用的方式是这样的 在用户登录时候会生成两份token 一份AccessToken用于返回给前端 前端带上这个令牌去请求后台接口 通常过期时间较短5分钟左右 一份RefreshToken放在R
  • GPU、CUDA和cuDNN分别是什么,之间又有什么关系?

    文章目录 GPU CUDA和cuDNN分别是什么 之间又有什么关系 1 GPU 2 CUDA 3 cuDNN GPU CUDA和cuDNN分别是什么 之间又有什么关系 1 GPU GPU 图形处理单元 Graphics processing
  • 一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别

    USDT是当前实用最广泛 市值最高的稳定币 它是中心化的公司Tether发行的 在今年的4月17日之前 市场上存在着2种不同类型的USDT 4月17日又多了一种波场TRC20协议发行的USDT 它们各自有什么区别呢 哪个转账最快到账 哪种最
  • 【ShaderToy】基础篇之谈谈点、线的绘制

    写在前面 写前面一篇的时候 发现还是不够基础 因此打算增加几篇基础篇 从点线面开始 希望可以更好理解 其实用Pixel Shader的过程很像在纸上绘画的过程 屏幕上的每一个像素对应了纸上的一个方格 如果你愿意 你甚至可以一个个判断像素的位
  • 【KingFusion】如何设置日期控件默认选择最近24小时

    哈喽 大家好 我是雷工 本篇记录一个日期时间控件的使用过程 以下为应用笔记 1 问题描述 KingFusion中 对于一些特定的查询情况下 需要设置日期时间控件默认显示前一天的日期时间到当前时间24小时内的选择范围 但是由于考虑到每月的天数
  • Amazon Fargate 使用 Seekable OCI 实现更快的容器启动速度

    虽然在部署和扩展应用程序时 使用容器进行开发的方式已日趋流行 但仍有一些领域可以改进 扩展容器化应用程序的主要问题之一是启动时间长 尤其是在纵向扩展期间 需要添加较新的实例 此问题可能会对客户体验 例如 当网站需要横向扩展以提供额外流量时
  • cross-tissue 成纤维细胞比例.r

    getwd setwd G lung fibrosis mouse stable state mouse ssfibro readRDS Mouse SS Fibro RDS library Seurat head mouse ssfibr
  • Vue组件生命周期与钩子函数

    组件生命周期 组件 组件是可复用的 Vue 实例 从创建到销毁的过程就是组件的生命周期 是一个时间段 组件生命周期钩子函数 vue3与vue2生命周期钩子函数略有不同 本文以vue2为主 VUE 提供的生命周期钩子函数 会伴随组件的生命周期
  • 超级签具体实现

    签名原理 使用了苹果提供给开发者的Ad Hoc分发通道 把安装设备当做开发设备进行分发 优势 直接分发 安装即可运行 稳定 不会有证书吊销导致的风险 缺点 单开发者账号的iPhone设备数量只有100个 整体架构 设备安装描述文件后 会向服
  • 数据结构(C语言)——单链表

    整体结构如上 看似简单 但第一次用C语言实现还是感觉有点吃力 尤其是特别容易让链表断裂 下面是代码 有链表的增删改查 注 这里E类型是用define将int进行了宏定义 include
  • java 单一登录

    对于一个帐号在同一时间只能一个人登录 可以通过下面的方法实现 1 在用户登录时 把用户添加到一个ArrayList中 2 再次登录时查看ArrayList中有没有该用户 如果ArrayList中已经存在该用户 则阻止其登录 3 当用户退出时