经过两天的研究,下面给两个方法.不个是webwork版本的,一个是修改过后的网上的意见监听器版本的

 (一)   首先先上自己的研究成果

      1:首先在baseAction 中或者直接在action中写一个方法,和一个静态map(保存唯一的session)

         静态map

Java代码  收藏代码
private static Map<String, HttpSession> httpssessionmap = new Hashtable<String, HttpSession>(); //避免重复登录 2:主方法(给一个返回值是为了给提示) Java代码 收藏代码
public Integer loginMethod(LoginInfo loginfo,Users user) throws Exception{
int returnnum=0;
if(httpssessionmap.containsKey(user.getUser_code())){
//qztc_LogInfo(user, (String)httpssessionmap.get(user.getUser_code()).getAttribute(LOGIN_IP));
try{//获取session
logger.info("因在其它地方重新登录被系统强制退出");
httpssessionmap.get(user.getUser_code()).removeAttribute(LOGIN_INFO);
}catch(Exception e){
e.printStackTrace();
}
httpssessionmap.remove(user.getUser_code());
if (pcount > 0)
pcount--;
Thread.sleep(10);
returnnum=1;
}
set(LOGIN_INFO,loginfo);
//set(LOGIN_INFO, new LoginInfo(user));
//set(LOGIN_IP, this.getIPAddress());
httpssessionmap.put(user.getUser_code(), getHttpSession());
pcount++;
info(getLogPrex_().append("进入系统").toString());
//info(this.LOG_TYPE_LONGIN, "进入系统");
return returnnum;
} 3:获得登录用户的唯一session Java代码 收藏代码
protected HttpSession getHttpSession(){
return ServletActionContext.getRequest().getSession();
} 4:set方法,设置session Java代码 收藏代码
protected void set(String name, Object value)
{
ActionContext.getContext().getSession().put(name, value);
} 5:说明: 最后可以在 用户登录的action中 调这个baseaction方法...接下来该干嘛干嘛去.. (二) 网上哥们给的意见 http://sunxin.org/forum/thread/22787.html(回帖的用户"钟爱java ") 应该是忘记session失效的问题了. 先上代码(代码整理得我都吐血了.) --接下来都是原话 SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录) Java代码 收藏代码
package com.test;
import javax.servlet.http.*;
import java.util.*; public class SessionListener implements HttpSessionListener{ private static HashMap hUserName = new HashMap();//保存sessionID和username的映射 /**以下是实现HttpSessionListener中的方法**/ public void sessionCreated(HttpSessionEvent se){
} public void sessionDestroyed(HttpSessionEvent se)
{
hUserName.remove( se.getSession().getId() );
} /*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUserName String-登录的用户名称
* @return boolean-该用户是否已经登录过的标志
*/ public static boolean isAlreadyEnter(HttpSession session,String sUserName,LoginInfo loginfo){
boolean flag = false;
if(hUserName.containsValue(sUserName)){
//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
flag = true;
//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if( ( (String)val ).equals(sUserName) ){
hUserName.remove(key);
}
}
hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username
System.out.println("hUserName = " + hUserName);
}
else{
//如果该用户没登录过,直接添加现在的sessionID和username
flag = false;
((ActionContext) session).put(LOGIN_INFO, loginfo);
hUserName.put( session.getId(),sUserName );
System.out.println("hUserName = " + hUserName);
}
return flag;
} /*
* isOnline-用于判断用户是否在线
* @param session HttpSession-登录的用户名称
* @return boolean-该用户是否在线的标志
*/
public static boolean isOnline(HttpSession session){
boolean flag = true;
if( hUserName.containsKey( session.getId() ) ){
flag = true;
} else{
flag = false;
}
return flag;
}
} web.xml部署于/App/WEB-INF下 Xml代码 收藏代码
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> <web-app>
<listener>
<listener-class>
com.inspirer.dbmp.SessionListener
</listener-class>
</listener>
</web-app>
应用部分 1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin") 既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线 2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.

java中如何实现同一账号不能同时登录的更多相关文章

  1. Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)

    在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...

  2. JAVA中使用FTPClient上传下载

    Java中使用FTPClient上传下载 在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在c ...

  3. JAVA中发送电子邮件的方法

    JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现.  一.下载JavaMail的架包,并导入项目中,如下: 二.附上代码例子,如下: 1.在main函数中对各项参数进行赋值 ...

  4. java中一个引人深思的匿名内部类

    前两天去面试javaweb问到一个问题,在你的项目中有没有用到线程,我特么的一想,这东西不是在c层面的吗,所以说我不了解线程..... 后来回去想啊想啊,我操这特么的不是再问我事物的控制,消息队列的回 ...

  5. (Java)微信之个人公众账号开发(二)——接收并处理用户消息(下)

    接下来,我们再讲一下图文消息: 如图: 大家可以先从开发者文档中了解一下图文消息的一些参数: 如上图,用户回复4时,ipastor返回了几条图文消息,上图中属于多图文消息,当然还有单图文消息,图文消息 ...

  6. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  7. 第77节:Java中的事务和数据库连接池和DBUtiles

    第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...

  8. 第74节:Java中的Cookie和Session

    第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...

  9. 第73节:Java中的HTTPServletReauest和HTTPServletResponse

    第73节:Java中的HTTPServletReauest和HTTPServletResponse HTTP协议 客户端与服务器端通讯的一种规则. request: 请求行 请求头 请求体 respo ...

随机推荐

  1. CentOS rsync小结

    前言 与cp,scp不同的是rsync工具不但可以本地拷贝,还可以远程拷贝以及同步数据. rsync工具在做数据备份方便非常受欢迎.试想一下,如果有数千万个文件或目录你怎么样制定拷贝计划呢?每一个选项 ...

  2. 19_B门长时曝光APP

    知识很基础-- 前几天买了个单反,特别想拍B门长时间曝光的效果.后来想想不如自己写个APP,实现屏幕背景的随机颜色以及全屏显示文字. 先上图: 这两张图片的左侧都很亮,这是因为APP里面忘记把&quo ...

  3. 【NOIP2011模拟11.1】钓鱼

    钓鱼 题目 Description 我们把钓鱼的过程放在坐标系里来考虑.图中蓝色的点为船,初始时它的坐标记为(Ax,y).河深为y,河宽为x.某个时刻会从左边界或右边界游出来一条鱼(左边的往右边游,右 ...

  4. ES6简单理解基本使用

    let const 原来的var声明标识符:可以重复声明,编译不报错. let,const声明标识符:不能重复声明,再声明编译报错. var声明的标识符作用域是当前函数,let和const是当前{块} ...

  5. Django结合Websocket进行WebSSH的实现

    什么是webssh? 泛指一种技术可以在网页上实现一个 终端.从而无需 之类的模拟终端工具进行 连接,将 这一比较低层的操作也从 架构扭成了 架构 这样的架构常用在运维制作开发一些堡垒机等系统中,或是 ...

  6. MoviePy v2.0.0.dev1尚不成熟,不建议大家使用

    ☞ ░ 前往老猿Python博文目录 ░ 在<重要消息:MoviePy v2.0.0.dev1预发布版本已经可以下载安装使用>之后老猿就安装了MoviePy v2.0.0.dev1这个版本 ...

  7. 第11.22节 Python 中re模块的字符串分割器:split函数

    一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...

  8. NET CORE通过NodeService调用js

    在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 .NET C ...

  9. js 几种跨域解决方法

    同源策略: JS只能与同一个域中的页面进行通讯,必须是协议.域名.端口都相同,相同域下才能相互通信,这可以被认为是一种通信原则,叫同源策略. 跨域: js跨域是指通过js在不同的域之间进行数据传输或通 ...

  10. bootstrap 扩展参数

    后台接受的参数形式 前端加载bootstrap时做的处理