- 浏览: 107227 次
- 性别:
- 来自: 大连
最新评论
-
liubey:
frogEye 写道 写得挺好的,但是不得不说:错别字一大堆 ...
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤 -
frogEye:
写得挺好的,但是不得不说:错别字一大堆
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤 -
卖火柴的老特工:
3Q.也是刚刚解决掉
Maven编译时两则信息 (Workspace以及default classpath container) -
liubey:
shmily2038 写道现在的技术书籍,就是缺少对细节的深入 ...
2014读书总结 -
shmily2038:
现在的技术书籍,就是缺少对细节的深入描绘,都没啥实际看点。
2014读书总结
对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现:
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中的用户
<%
Account account = (Account) request.getSession().getAttribute("account");
if(account != null){
if(LoginAction.logonAccounts==null){
LoginAction.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);
}
}
}
%>
为了保证上面代码可以执行完毕,3秒后关闭此弹出窗口(也位于accountUnbound.jsp中)
<script>
setTimeout("closeWindow();",3000);
function closeWindow(){
window.close();
}
</script>
③ 使LoginAction 实现implements HttpSessionListener,并实现sessionCreated,sessionDestroyed方法,在sessionDestroyed中删除ArrayList中的用户(用户超过30分钟不活动则执行此方法)
public void sessionDestroyed(HttpSessionEvent event) {
// 取得不活动时的sessionId,并根据其删除相应logonAccounts中的用户
String sessionId = event.getSession().getId();
for (int i = 0; i < logonAccounts.size(); i++) {
Account existAccount = (Account)logonAccounts.get(i);
if(account.getSessionId().equals(existAccount.getSessionId())){
logonAccounts.remove(account);
}
}
}
注:
对于上面的,由于弹出窗口很容易被防火墙或者安全软件阻拦,造成无法弹出窗口,从而短时间不能登录,这种情况可以用AJAX来代替弹出窗口,同样在后台执行删除用户的那段代码,却不会受到防火墙限制:
<script>
// <![CDATA[
var http_request = false;
function makeRequest(url) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
}
}
}
if (!http_request) {
alert('Giving up Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url, true);
http_request.send(null);
}
function alertContents() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
window.close();
} else {
alert('There was a problem with the request.');
}
}
}
function window. onbeforeunload() {
makeRequest ('accountUnbound.jsp');
}
//]]>
</script>
对于上面的这段ajax代码,在网上有很多详细的解释,把它加到onbeforeunload()浏览器关闭事件中,在后台执行代码的效果很好,不必担心弹出窗口有时候会无效的问题。
使用这段代码后,上面②中accountUnbound.jsp中的那段关闭弹出窗口window.close();的js代码就不需要了。
版权所有:(xiaodaoxiaodao)蓝小刀 xiaodaoxiaodao@gmail.com
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中的用户
<%
Account account = (Account) request.getSession().getAttribute("account");
if(account != null){
if(LoginAction.logonAccounts==null){
LoginAction.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);
}
}
}
%>
为了保证上面代码可以执行完毕,3秒后关闭此弹出窗口(也位于accountUnbound.jsp中)
<script>
setTimeout("closeWindow();",3000);
function closeWindow(){
window.close();
}
</script>
③ 使LoginAction 实现implements HttpSessionListener,并实现sessionCreated,sessionDestroyed方法,在sessionDestroyed中删除ArrayList中的用户(用户超过30分钟不活动则执行此方法)
public void sessionDestroyed(HttpSessionEvent event) {
// 取得不活动时的sessionId,并根据其删除相应logonAccounts中的用户
String sessionId = event.getSession().getId();
for (int i = 0; i < logonAccounts.size(); i++) {
Account existAccount = (Account)logonAccounts.get(i);
if(account.getSessionId().equals(existAccount.getSessionId())){
logonAccounts.remove(account);
}
}
}
注:
对于上面的,由于弹出窗口很容易被防火墙或者安全软件阻拦,造成无法弹出窗口,从而短时间不能登录,这种情况可以用AJAX来代替弹出窗口,同样在后台执行删除用户的那段代码,却不会受到防火墙限制:
<script>
// <![CDATA[
var http_request = false;
function makeRequest(url) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
}
}
}
if (!http_request) {
alert('Giving up Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url, true);
http_request.send(null);
}
function alertContents() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
window.close();
} else {
alert('There was a problem with the request.');
}
}
}
function window. onbeforeunload() {
makeRequest ('accountUnbound.jsp');
}
//]]>
</script>
对于上面的这段ajax代码,在网上有很多详细的解释,把它加到onbeforeunload()浏览器关闭事件中,在后台执行代码的效果很好,不必担心弹出窗口有时候会无效的问题。
使用这段代码后,上面②中accountUnbound.jsp中的那段关闭弹出窗口window.close();的js代码就不需要了。
版权所有:(xiaodaoxiaodao)蓝小刀 xiaodaoxiaodao@gmail.com
发表评论
-
2014读书总结
2015-01-11 16:10 1739原文刊于本人博客。 20 ... -
Maven编译时两则信息 (Workspace以及default classpath container)
2013-09-18 15:14 5485使用Maven一年有余,却总是被两则不起眼的编译信息困扰,终想 ... -
Java中未被初始化的字符串打印出“null”的问题的分析
2013-05-07 09:16 5840今天在研究Java面试题的时候发现了这道题,觉得挺有意思,记录 ... -
搬家鸟
2013-03-13 21:26 1063买了个域名,搭了个博客,http://www.liubey.o ... -
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤
2012-10-09 23:36 72661:Maven的选择和配置 目前Maven主流版本包括Mav ... -
SUSE10.2 安装java_JDK1.6
2011-01-26 14:02 2398首先先去java.sun.com下载最新的jdk 我下载的是j ... -
利用HTTPCLIENT操作人人网:登陆,发布状态,随意访问任何人等
2010-12-12 09:38 122这几天研究了一下httpclient,使用它操作人人网做一些事 ... -
break和continue
2010-11-17 10:02 1154break是指强制退出,不执行循环中剩余部分代码,而conti ... -
继承时候的初始化顺序
2010-09-19 09:28 11341. 父类--静态变量 2. 父类--静态初始化块 3. 子类 ... -
一些数据结构的知识
2010-09-17 11:03 12331:ArrayList使用数组实现List接口,所以对于快速的 ... -
JavaScript操作cookie一例
2010-07-27 09:14 990[code="html] <html> ... -
数据结构之栈 队列 优先级队列 简单小结
2010-07-19 15:00 22281。栈、队列和优先级队列是经常用于简化某些程序操作的数据结构。 ... -
利用数据结构中的栈实现单词的反转
2010-07-16 15:40 1600package com.javaeye.liubey.al ... -
java的加密与解密
2010-07-12 15:29 4951加密算法有很多种:这里只大约列举几例: 1:消息摘要:(数字 ... -
“不变"和“只读"的区别
2010-07-12 10:03 940“不变”(Immutable)与“只读”(Read Only) ... -
JpetStore中MVC机制实现的研究,BeanAction以及BaseBean工作机制(看完有种恍然大悟的感觉啊!)
2010-07-07 16:57 2160以前学习iBATIS时候只是粗略的看了一下代码,今天翻出来从新 ... -
jdk源代码中有关日期比较
2010-07-07 09:31 1074public int compareTo(Date anoth ... -
String.intern方法
2010-07-06 17:06 1052以前没有注意到这个方法,看effective Java时候发现 ... -
Java 专业人士必备的书籍和网站列表
2010-07-06 13:17 1080这些都是您书架上必备的书和应该经常使用的 Web 链接。时 ... -
2010 年 Java 平台圆桌会议---展望 Java 行业的未来
2010-07-06 08:37 1266简介: Java™ 平台以稳定著称,其社区却相当活跃,但这并不 ...
相关推荐
在IT行业中,"同一个账号,同一时间只能允许他登录一次" 这个需求通常被称为单点登录(Single Sign-On, SSO)。这是一个重要的安全性措施,防止用户账户被多个设备或不同地点同时使用,以增加系统的安全性,防止未经...
标题提到的“ASP帐号只能同时登陆一个”,指的是同一个账号在同一时间只能在一个设备或浏览器会话上登录,这通常被称为单点登录(Single Sign-On, SSO)机制。 单点登录的设计目的是为了增强安全性,防止同一账号被...
因此,限制同一用户账户在同一时间只能在一个地方登录是非常必要的。 #### 二、实现原理及步骤 本文介绍的方法主要是通过ASP.NET中的全局状态存储机制来实现的,具体步骤如下: 1. **使用Application对象存储在线...
通过以上步骤,我们就可以在Spring Security框架下实现单点登录,确保用户在同一时间只能在一个设备或浏览器上登录。这样的机制有助于提高系统的安全性,防止账户被恶意操作。标签“源码”表明了可能需要深入阅读和...
在Java Web开发中,实现QQ登录功能并限制一个账号同一时间只能一个人登录,涉及到的关键技术包括用户会话管理、状态跟踪以及异常情况处理。以下是对这个功能实现的详细解析: 首先,我们需要一个全局的存储结构来...
3. **处理登录冲突**:一旦检测到同一账号在不同位置尝试登录,系统会将之前的登录状态`Login_status`设置回0,强制下线之前的登录会话,从而确保同一账号在同一时间只能在一个地方登录。 #### 利用ASP.NET管理登录...
这个需求主要是为了保护用户的安全,防止他人盗用账户或者避免多个人同时操作同一个账号导致的数据混乱。下面将详细解释两种实现这一功能的方法:使用Session和在数据库中设置一个字段。 **方法一:使用Session** ...
4. **会话唯一性**:为了确保一个账号只能在一个地方登录,我们可以创建一个额外的会话标志,例如`$_SESSION['single_login']`。在用户首次登录时,将其设置为真,并在数据库中记录该用户的会话ID。 5. **检测多处...
java web开发一个帐号同一时间只能一个人登录 .doc java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能).doc java中如何实现同一账号不能同时登录.doc session保证两用户不能同时登陆一个账号.doc
在C#编程中,"同一个账号只能登录一次"的需求是一个常见的多用户系统设计规范,它旨在确保用户账户的安全性和系统的一致性。当一个账号在一处登录后,其他地方的同一账号尝试登录时,系统应该拒绝该请求或者强制结束...
该变量用于控制是否允许同一账号在同一时间内由不同的人或设备登录。 ```php //-- 是否允许多人用同一帐号同时登录 -- $ONE_USER_MUL_LOGIN = 0; //1 允许; 0 禁止; ``` 3. **设置禁止多处登录**:如果希望...
很多开发者都会遇到这样的情况:如何使同一个用户在同一时间内只允许登录一次。常见的解决方案是使用数据库中标识字段,登录时置 1,退出时置 0,但是这种方法存在一些问题,如用户直接关闭浏览器而不是通过程序中的...
这里我们探讨的是一种集群环境下的解决方案,它允许我们确保一个账号在同一时间只能在一个地方登录,即实现“单点登录”功能。这个方案主要基于Spring Boot和Redis技术栈来实施。 **Spring Boot** 是一种基于Java的...
这个程序的核心理念是确保同一时间只有一个用户能够使用特定的账号进行登录,防止了多个人同时操作同一账号的情况,增加了系统的安全性。 首先,我们需要理解这个程序的基本架构。它通常包含以下几个关键部分: 1....
在多用户环境中,确保一个ASP.NET网页在同一时刻仅被一个登录用户占用是非常重要的,这涉及到用户体验、数据一致性和安全性。这种需求通常被称为“独占访问”或“会话锁定”。 在ASP.NET中,实现独占访问的一种常见...
客户端:打开时可选择登录或者注册,登陆成功后由服务端记录为在线用户,同一个账号同一时间只能登录一个,后登录的会将已经在线的同个账号挤下线(异地登陆)。登陆后可以选择群聊、私聊、上传文件到共享网盘、查看...
"防止用户重复登录"这一话题,主要关注的是如何确保单一账号在同一时间只能在一个设备或浏览器会话中进行有效登录,以提升系统的安全性并保护用户的隐私。 一、为什么要防止用户重复登录? 1. 安全性:防止恶意...
方法一: 复制代码 代码如下: string sKey = username.Text.ToString().Trim(); // 得到Cache中的给定Key的值 string sUser = Convert.ToString(Cache[sKey]); // 检查是否存在 if (sUser == null || sUser == String...
场景一要求同一时刻同一个用户只能在一个地方登录,如果尝试在另一处登录,前一次的登录会话将会被终止。场景二则是允许用户在不同设备或浏览器上登录,但当新的登录发生时,旧的登录会话会被挤掉,并且通知用户这一...
特殊算法保障同一帐号同一时间只能有一个人使用; 14.可在后台设定阻止特定的IP地址登陆; 15.会员密码采用MD5加密,采用电子邮件取回密码,注册成功自动发送开通邮件; 16.管理员密码采用高强度MD5加密,最大程度上...