java web实现同一账号在不同浏览器不能同时登录
网上看了很多方法,个人也看了,自己也总结了几个比较常用的:
前提都是用session监听器,对session的创建与销毁进行监听
一、在用户登录时保存该用户的状态有这几种保存方式:
1、保存到内存中(application ,servletcontext ,个人也是推荐这种方式)
2、保存状态到数据库,至于具体的怎么保存你可以随意返回,如:0,1两种状态
3、保存到文件中,对文件的读写
以上是登录用户的状态,这对于大家来说都没有什么问题。
二、 这时如果同一用户登录了,你可以在登录成功后(保存信息之前)进入到上面的状态 中进行匹配判断,如果存在就提醒此用户你的账号已登录。
三、关键在于该用户的销毁
invliate(),调用这个方法,通过Session的监听器,进行对当前用户的删除。
Session过期,也会调用Session监听器。
讨论最多的就是在比如用户没有自己去注销session.invalidate()方法,而是直接关闭了 浏览器,这时怎么办?(浏览器关闭半个小时候,默认注销session,监听器这时才调用sessionDestroyed方法)。
首先要明确的一点,用户关闭浏览器,服务器端是无法得知的(因为web客户浏览器与服务器之间是无状态的),网上也有一些解决方案,比如通过js来判断用户是否关闭了浏览器,是的次方法可行,但是如果用户操作时,打开了多个窗口呢,这里也有方法:
1、一个方法还是比较好的,通过cokkie保存当前用户开了的页面数,如果页数为一的话,就可以触发js的注销Session了。
2、先把Session的生命期设置的短一点,用类似ajax这种异步请求方式周期不断的去请求后台,这样可以保证当前的这个Session有效,如果用户退出后,该Session也会很快的过期。
上面的两种方式都有些缺陷,如:
1、用户删除cokkie的话,就无法判断准确,这种可能应该不多吧(在访问当前网站时)
2、有延迟,服务器压力相对来说比较大
还有一种方式与上面的思考角度不一样(当然也要看需求了),如果有用户登录时,就注销之前已登录的同一用户。
实现方式与上面应该是差不多的,唯一不同之处在于,不用去刻意的想办法让用户退出了(注销Session)。
四、虽然像百度,CSDN等这些网站都没有这样做,当然也没有必要这要这样做。
但是在我们做企业内部应用的时候有时候可能会要求我们这样做(同一账号在统一时间只能在一个登录),下面是个例子
我们先定义两个Map对象需要用到,存放用户与HttpSession的关系和sessionId与用户的关系。用来记录当前登录的用户是否登录和当前session是否已经绑定了登录用户。
java web实现同一账号在不同浏览器不能同时登录的更多相关文章
- Web应用多账号系统设计及微信扫码登录实现
Web应用多账号系统设计及微信扫码登录实现 1 前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...
- Eclipse创建的Java Web项目,如何启用外置浏览器访问jsp或者html页面
当我们用Eclipse创建了一个Java Web项目,想访问一个jsp或者html页面时,通常会在目标页面(以jsp为例)上点击鼠标右键,选择[Run As]——>[Run on Server] ...
- Java Web 开发利用Struts2+Spring+mybatis写一个用户登录界面以及简单的数据交互
框架的东西太复杂也难以讲通,直接上代码: 一.首先得配置环境 和导入必要的jar包 有一些重要的如下: Filter文件夹下的SafetyFilter.java model文件夹下的 Global ...
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- java web程序上传文件,浏览器显示连接被重置
上传文件时,到13%时浏览器显示连接被重置如图: 参考网上很多方法 比如设置server.xml 的相应大小.时间,然并没有解决问题 connectionTimeout="2000000&q ...
- Web终端之使用shellinabox在浏览器进行ssh登录
shellinbox有一个内建的web server作为基本的web ssh client,允许你通过指定的端口访问linux服务器的ssh shell,只要你的浏览器支持AJAX/JS/CSS就可以 ...
- [原创]java WEB学习笔记29:Cookie Demo 之自动登录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Java web应用开发技术
Java web应用程序供用户通过浏览器发送请求,程序通过执行产生web页面,并将页面传递给客户机器上的浏览器,将得到的web页面呈现给用户. 一个完整的Java web应用程序通常由许多组件构成的, ...
- 解决java web中safari浏览器下载后文件中文乱码问题
解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...
随机推荐
- 为什么有些应用非VxWorks不可
实时操作系统(RTOS)是专用于对时间精确度敏感的操作系统.典型的情况是,这种应用需要从传感器收集数据.做出分析并对关键性设备进行控制,例如飞机.列车.手术刀.这类控制必须精准,不容许出现 ...
- ActivityLifecycleCallbacks
public class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks, ActivityS ...
- Docker安装ElasticSearch 版本7.1.1
一.Docker 部署 ElasticSearch 1.从仓库中查找所有ElasticSearch的镜像 [root@iZwz99dhxbd6xwly17tb3bZ app]# docker sear ...
- Java split(".") 和 split("\\.")
Java split(".") 和 split("\\.") 问题描述 使用 . 分解 IP 的各个段,并打印,如:192.168.10.123,分解为 192 ...
- Python基于回溯法解决01背包问题实例
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
- Winform之跨线程更新UI
Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...
- JavaScript Cookie常用设置
cookie是一种早期的客户端存储机制,起初是针对服务器端脚本设计使用的,只适合存储少量文本数据.从最底层来看,作为HTTP协议的一种扩展实现它.cookie数据会自动在Web浏览器和Web服务器之间 ...
- (C#)Appium自动化测试之mobile:shell输入法
1.ADB执行Shell命令 a.如果电脑上已装Appium,那么需要在高级设置里勾选 Relaxed Security. 如图: b.cmd命令行启动appium appium --rela ...
- 网页制作入门——HTML(2)编码与字符实体
在上一期,我们顺口提到了——你写的网页在打开后,可能发现只是一串乱码.那么这是为什么呢? 这就是编码的神奇力量! 八卦的启示——什么是编码? 编码的思想,很早就在中国诞生了,从还不太明朗的结绳记事.算 ...
- 【C/C++】BOOST 线程完全攻略 - 基础篇
C++多线程开发是一个复杂的事情,mfc下提供了CWinThread类,和AfxBeginThread等等函数,但是在使用中会遇到很多麻烦事情,例如线程之间参数传递的问题,我们一般都是把参数new一个 ...