总述

前些天,无意之间想到这个问题,感觉挺实用,有必要整理一下。随手写了一个简单的mode,感觉并不算难。思路理顺其实挺简单的。

为实现用户不可同时登陆,只要想想现实中新浪,百度等,只要一处登陆就将另一处的给“挤”下去,就可以知道实现结果为何。然后再逆推之,即可形成较为清晰的思路。我们一起来探讨一下。

首先,我们得明白用户登录使用什么登陆的,即用户在线的原理。这只是将用户的对象存放在了session中而已,然后再frame中进行调用,其他特定页面也进行直接引用就行。那么实现“挤下来”的功能就是让新生成的session有效,让原来存放用户的session失效就行。到此,大体思路已经有了。那怎么实现呢?

想要知道怎么实现,就必须要明白session存放用户对象的过程了。在用户登录之后,我们可以得到用户的对象user,而存放到session中需要执行session.setAttribute(key,value); 我们将用户的userId或是其他的唯一标识存为key,将用户对象存为值。这样就能随时随地调用唯一用户了。user存放的问题解决了,那相同 登录 时session废除的问题呢?

这个其实也不难,我们可以更具session的特性一样,用map进行存贮,将用户的标识存为key,而将其所对应的session存为value,那么当重复用户登录时,只需要取出对应的session,将其invalidate就行了。

至此,实现思路已经明了,聒噪了这么久,大家都急不可耐地想看代码了吧?以下是代码:

前置准备,jsp界面

界面很简单,只是一个简单的登录界面

<form action ="<%=request.getContextPath()%>/UserWXPServlet" method = "post"> 用户名š<input type = "text" name = "username"/><br/> 密码š<input type = "text" name = "password"/><br/> <input type = "submit" value ="提交"/>
</form> 

成功后跳转页面

欢迎:${sessionScope.user.username}登陆!<br/>

我这没有写失败页面,大家可以自己写,失败页面也没什么好说的了

entity和登录的实现

user的javabean

private String username;
private String password;
public User() {
}
public User(String user, String password) { super(); this.username = user; this.password = password;
}
public String getUsername() { return username;
}
public void setUsername(String username) { this.username = username;
}
public String getPassword() { return password;
}
public void setPassword(String password) { this.password = password;
} 

登录user的service实现方法,这里就不写dao和接口了,一切以简单为

public boolean dologin(User user){ Properties pro = new Properties(); InputStream is = UserWXPServlet.class.getClassLoader().getResourceAsStream("user_wxp.properties"); String password = null; System.out.println(is+"--------->"+pro); if(user==null){ return false;  } try { pro.load(is); password = pro.getProperty(user.getUsername()); if(user.getPassword()!=null&&user.getPassword().equals(password)){ System.out.println("登陆成功"); return true; } } catch (IOException e) { e.printStackTrace(); }finally{ if(is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; } 

登录成功返回true,失败则返回false。

Servlet和相应的逻辑工具类

接下来的代码就到了真正操作用户的代码了

本人在这里定义了两个类,一个工具类,一个核心servlet处理类

在工具类中加入了一些公共的元素,如以下代码:

/** * 每一个用户存放一个session。便于各种操作!!! */ public static Map<String, HttpSession> mapSession = new HashMap<String,HttpSession>();
用户退出的代码(必须飞废除session或是remove相应的用户对象):
[java] view plain copy
public static void userLogout(String username){ if(mapSession.get(username)!=null){ //得到需要退出的用户的session HttpSession session = mapSession.get(username); //在map<username,session>中移除该用户,记住想要退出该用户,必须将该session废除或是remove掉user mapSession.remove(username); //得到session的所属性合集 Enumeration e = session.getAttributeNames(); //删除所有属性 while(e.hasMoreElements()){ String sessionName = (String) e.nextElement(); session.removeAttribute(sessionName); } //废除该session session.invalidate(); }
} 

Servlet的代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = new User(username, password); UserService userService = new UserService(); HttpSession session = request.getSession(); if(userService.dologin(user)){ //登录成功之后将用户插入到session中 session.setAttribute("user", user); if(cheackSession(username)){ //如果该session在此之前已经存在,则将该用户进行退出操作 DbUtil.userLogout(username); } //将新的session存放到map<username,session>中 DbUtil.mapSession.put(username, session); //操作成功,跳转,此处最好为重定向,让别人知道登录成功了 request.getRequestDispatcher("login").forward(request, response); return ; } //此处跳转到失败页面,如果读者有兴趣,可以自行添加
} 

其中cheackSession(username) 的代码如下:

/** * 检查是否已经含有此session * @param username * @return true:已经存在,该删! false:未存在 */
private boolean cheackSession(String username){ HttpSession session = DbUtil.mapSession.get(username); if(session!=null){ return true; } return false;
} 

最后附上Servlet的xml配置

<servlet> <description> 用于测试 ,用户不可重复登录 </description> <display-name>UserWXPServlet</display-name> <servlet-name>UserWXPServlet</servlet-name> <servlet-class>com.fingard.rabbit.wxp_test.Servlet.UserWXPServlet</servlet-class>
</servlet>
<servlet-mapping> <servlet-name>UserWXPServlet</servlet-name> <url-pattern>/UserWXPServlet</url-pattern>
</servlet-mapping> 

转载至:http://www.jb51.net/article/101495.htm

java 同一用户不允许同时登陆相关推荐

  1. java培训教程分享:Java中用户如何自定义异常?

    我们在学习java技术的时候应该有了解过,在java中是定义了很多的异常类的,虽然这些大量异常类可以帮助我们描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况,例如在 ...

  2. 2021年3月9日 北京快手Java开发–用户增长方向 实习面经(一面)

    title: 2021年3月9日 北京快手Java开发–用户增长方向 实习面经(一面) tags: 面经 2021年3月9日 北京快手Java开发–用户增长方向 实习面经(一面) 自我介绍你能介绍一下 ...

  3. Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别

    Java 创建用户异常类.将异常一直向上抛. throw和throws的区别 参考文章: (1)Java 创建用户异常类.将异常一直向上抛. throw和throws的区别 (2)https://ww ...

  4. java ee用户登录_EE Servlet 3:使用会话和过滤器开发用户登录

    java ee用户登录 我在上一篇文章中介绍了Application类,您可以在其中设置后端服务. 我添加的一个示例服务是UserService . 该服务将加载包含用户名和密码集的Java用户属性文 ...

  5. java都要caps标点_第 1 章 管理 Java CAPS 用户

    第 1 章 管理 Java CAPS 用户 在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) ...

  6. Hadoop用户配置免密登陆

    Hadoop用户配置免密登陆, 参考其他免密配置方法自己总结的更简洁的步骤. 要实现A免密登陆B,需要把A生成的公钥放到B的对应目录下, 要实现ABC之间免密登陆,把3者的公钥汇总到一个文件中, 然后 ...

  7. Java 实现用户登录项目

    Java 实现用户登录项目 需求: 在页面中要求输入用户名和密码,并显示验证码.在三项都通过验证后显示登录成功否则登录失败 分析; 在验证用户名密码之前应该先判断验证码是否通过验证,防止多次连接数据库 ...

  8. JAVA实现用户抽奖包含完整代码

    JAVA实现用户抽奖 需求分析 1)实现三个基本功能:登录.注册.抽奖. 2)登录:用户输入账号密码进行登录,输入账号后会匹配已注册的用户,若输入用户不存在则退出,密码有三次输入机会,登录成功后主界面 ...

  9. java获取用户的所在省份、城市的接口

    java获取用户的所在省份.城市的接口代码分享 解决方法: 1.以下是调用第三方接口获取用户地理位置信息的代码: private static void getlocation() { URL url ...

最新文章

  1. 背景建模之单高斯实现
  2. PowerDesigner基本使用
  3. Kubernetes 集群 DNS 服务发现原理
  4. a标签实现不跳转点击
  5. shader 获取法线_Unity Shader 入门到改行5——法线贴图
  6. **CI中使用IN查询(where_in)
  7. Win7,Win8下多实例运行Excel2010
  8. springboot集成oauth2和JWT(授权码模式)
  9. (转)PowerDesigner教程系列(二)概念数据模型
  10. 跨境独立站卖家如何把握关键词优化?
  11. 洛谷 P2089 烤鸡
  12. 【个人笔记】OpenCV4 C++ 快速入门 23课
  13. java开发常用的linux命令,Java开发中最常用的Linux命令整理
  14. matlab除法不对,matlab中除法的使用,错误使用 / 矩阵维度必须一致
  15. Android,App 常用图标尺寸规范
  16. 文档损坏了怎么修复?文档修复方法分享
  17. antd tab右键菜单renderTabBar
  18. 高手UI设计师干货总结分享品牌LOGO设计的过程要求及方法
  19. 武汉新时标文化传媒有限公司抖音小店公告标题怎么写?
  20. 完美解决!无法启动此程序,因为计算机中丢失libmysql.dll解决方案(详细版!)

热门文章

  1. 用html实现切换夜间模式
  2. java api 第一个类是_java.常用API
  3. STM32——OV2640摄像头实验
  4. php教案 职校,职校主题班会教案
  5. 原生JS实现钟表效果
  6. animator 控制移动_unity3d – 使用NetworkTransform和NetworkAnimator进行流畅的移动
  7. Vscode编辑器使用教程
  8. ガリレオの苦悩 密室る 1
  9. 多域名实现单点登录详解
  10. 嘀!你的公积金账户多了这样一笔钱