- 浏览: 105501 次
- 性别:
- 来自: 大连
最新评论
-
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 1683原文刊于本人博客。 20 ... -
Maven编译时两则信息 (Workspace以及default classpath container)
2013-09-18 15:14 5441使用Maven一年有余,却总是被两则不起眼的编译信息困扰,终想 ... -
Java中未被初始化的字符串打印出“null”的问题的分析
2013-05-07 09:16 5811今天在研究Java面试题的时候发现了这道题,觉得挺有意思,记录 ... -
搬家鸟
2013-03-13 21:26 1012买了个域名,搭了个博客,http://www.liubey.o ... -
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤
2012-10-09 23:36 72301:Maven的选择和配置 目前Maven主流版本包括Mav ... -
SUSE10.2 安装java_JDK1.6
2011-01-26 14:02 2366首先先去java.sun.com下载最新的jdk 我下载的是j ... -
利用HTTPCLIENT操作人人网:登陆,发布状态,随意访问任何人等
2010-12-12 09:38 122这几天研究了一下httpclient,使用它操作人人网做一些事 ... -
break和continue
2010-11-17 10:02 1127break是指强制退出,不执行循环中剩余部分代码,而conti ... -
继承时候的初始化顺序
2010-09-19 09:28 11111. 父类--静态变量 2. 父类--静态初始化块 3. 子类 ... -
一些数据结构的知识
2010-09-17 11:03 12051:ArrayList使用数组实现List接口,所以对于快速的 ... -
JavaScript操作cookie一例
2010-07-27 09:14 961[code="html] <html> ... -
数据结构之栈 队列 优先级队列 简单小结
2010-07-19 15:00 21851。栈、队列和优先级队列是经常用于简化某些程序操作的数据结构。 ... -
利用数据结构中的栈实现单词的反转
2010-07-16 15:40 1571package com.javaeye.liubey.al ... -
java的加密与解密
2010-07-12 15:29 4923加密算法有很多种:这里只大约列举几例: 1:消息摘要:(数字 ... -
“不变"和“只读"的区别
2010-07-12 10:03 914“不变”(Immutable)与“只读”(Read Only) ... -
JpetStore中MVC机制实现的研究,BeanAction以及BaseBean工作机制(看完有种恍然大悟的感觉啊!)
2010-07-07 16:57 2127以前学习iBATIS时候只是粗略的看了一下代码,今天翻出来从新 ... -
jdk源代码中有关日期比较
2010-07-07 09:31 1026public int compareTo(Date anoth ... -
String.intern方法
2010-07-06 17:06 1027以前没有注意到这个方法,看effective Java时候发现 ... -
Java 专业人士必备的书籍和网站列表
2010-07-06 13:17 1057这些都是您书架上必备的书和应该经常使用的 Web 链接。时 ... -
2010 年 Java 平台圆桌会议---展望 Java 行业的未来
2010-07-06 08:37 1248简介: Java™ 平台以稳定著称,其社区却相当活跃,但这并不 ...
相关推荐
Web项目中经常遇到的问题就是同一用户名多次登陆...本文介绍的方法是采用类似于MSN登陆的方法,第二次登陆时会把第一次的登陆注销掉,第一次登陆将会类似于MSN弹出:您的帐号已在别处被登陆,您被强迫下线的提示信息。
对于一个帐号在同一时间只能一个人登录,下文给大家介绍的非常详细,对java web qq 登录功能感兴趣的朋友一起看看吧
NULL 博文链接:https://lihao312.iteye.com/blog/1909205
NULL 博文链接:https://onestopweb.iteye.com/blog/2380986
java web开发一个帐号同一时间只能一个人登录 .doc java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能).doc java中如何实现同一账号不能同时登录.doc session保证两用户不能同时登陆一个账号.doc
完美解决ASP.NET网页在同一时刻仅被一个登录用户占用的方案例子代码。http://www.linjon.cn, 成都领君科技有限公司
客户端:打开时可选择登录或者注册,登陆成功后由服务端记录为在线用户,同一个账号同一时间只能登录一个,后登录的会将已经在线的同个账号挤下线(异地登陆)。登陆后可以选择群聊、私聊、上传文件到共享网盘、查看...
特殊算法保障同一帐号同一时间只能有一个人使用; 14.可在后台设定阻止特定的IP地址登陆; 15.会员密码采用MD5加密,采用电子邮件取回密码,注册成功自动发送开通邮件; 16.管理员密码采用高强度MD5加密,最大程度上...
这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...
用户帐号一站式通用,即无无论是在商城还是在论坛只须注册一个帐号即可,全站使用,是目前网上开店的理想平台。 三七、增加了商城报价中心功能! 对于商城商品数量较多的网站,查找一个商品或快速浏览商品是经常的...
用户帐号一站式通用,即无无论是在商城还是在论坛只须注册一个帐号即可,全站使用,是目前网上开店的理想平台。 三八、增加了商城报价中心功能! 对于商城商品数量较多的网站,查找一个商品或快速浏览商品是经常的...
用户帐号一站式通用,即无无论是在商城还是在论坛只须注册一个帐号即可,全站使用,是目前网上开店的理想平台。 三八、增加了商城报价中心功能! 对于商城商品数量较多的网站,查找一个商品或快速浏览商品是经常的...
根据商城的设计原则,对于同一商品如果多次点购买分按一个商品购买多次计算,但用户选择的同一个商品,如果选择了不同颜色或尺码,这个问题就出现了,Html静态版现已解决这个问题,同一商品选择不同颜色或尺码进行...
首先在共享资源提供端创建一个新的账号,然后指定该账号的访问权限。接下来在要访问该共享资源的客户机中新建一个相同用户名和密码的账号,使用此账号登录客户机后,就能正常访问该账号所允许的共享资源。此方法较为...
本考试系统由前台考生考试部分和后台系统管理部分组成。 一、前台部分 1、 选择课程: ...“后台抽题”是把多人同时在线抽题的工作交给管理员一个人进行,考生只要登陆后做好准备就行了。适合大型...
根据商城的设计原则,对于同一商品如果多次点购买分按一个商品购买多次计算,但用户选择的同一个商品,如果选择了不同颜色或尺码,这个问题就出现了,时尚版现已解决这个问题,同一商品选择不同颜色或尺码进行多次...
支持一个会员账号只允许一个会员登录,可以有效防止一个会员账号多人使用的情况; 支持会员注册信息管理,轻松地收集所需的会员资料; 支持会员登录时是否需要验证码; 支持自定义会员组 支持注册会员赠送资金、...
select:从一个或多个表中检索一个或多个数据列。包含信息:想选择什么表,从什么地方选择。必须要有From子句。(最常用) 当从多张表里查询的时候,会产生笛卡尔积;可用条件过滤它。 当两个表有相同字段时必须加...
感觉是同一文件,删除一个,对另一个没有影响;须两个都删除才算删除。 ln -s file1 file1.sln 创建软链接。可跨系统操作,冲破操作权限;也是快捷方式。 八、时间显示 date 显示时间,精确到秒 用法 date [-u]...
在更换全新编辑器的基础上,增加了“上传文件管理”进行更新,使商品大小图与编辑器所上传的图片共享一个目录,这样可以实现“上传文件管理”功能可以管理所有系统上传的图片的浏览与删除操作,解决了原来只能删除...