javaweb实现一个账号只能同时被一个人使用(Java实现)

2023-11-15

大家在登陆qq的时候,电脑上登陆了qq,如果另一台机器上也登陆该qq账号,那么之前的qq账号会被挤下去。

我们现在用web的方式来做一个非常简单的演示。

先简单的说一下功能吧,

用户只有一个User,这个entity设置成账号为hello,密码world


这样做为了简化不到数据库里面去查用户的账号信息。

首先,我们看一看我们的web.xml


  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"  
  5.          version="3.1">  
  6.   
  7.     <listener>  
  8.         <listener-class>SessionListener</listener-class>  
  9.     </listener>  
  10. </web-app>  
web.xml里面就配置了一个HttpSessionListener


类SessionListener的实现如下

  1. import javax.servlet.http.HttpSession;  
  2. import javax.servlet.http.HttpSessionEvent;  
  3. import javax.servlet.http.HttpSessionListener;  
  4. import java.util.HashMap;  
  5.   
  6. /**  
  7.  * Created by HuLuo on 2016/8/20.  
  8.  */  
  9. public class SessionListener implements HttpSessionListener  
  10. {  
  11.     /**  
  12.      * 该HashMap以用户名-HttpSession对象存储一个账号只能被一个人登陆的信息。  
  13.      */  
  14.     public static HashMap<String,HttpSession> sessionMap = new HashMap<String,HttpSession>();  
  15.   
  16.     @Override  
  17.     public void sessionCreated(HttpSessionEvent httpSessionEvent)  
  18.     {  
  19.         HttpSession session = httpSessionEvent.getSession();  
  20.     }  
  21.   
  22.     @Override  
  23.     public void sessionDestroyed(HttpSessionEvent httpSessionEvent)  
  24.     {  
  25.   
  26.         HttpSession session = httpSessionEvent.getSession();  
  27.   
  28.         delSession( session );  
  29.     }  
  30.   
  31.     public static synchronized void delSession(HttpSession session)  
  32.     {  
  33.         if(session != null)  
  34.         {  
  35.   
  36.             // 删除单一登录中记录的变量  
  37.             if(session.getAttribute( "users" ) != null)  
  38.             {  
  39.                 User user = (User) session.getAttribute( "users" );  
  40.                 SessionListener.sessionMap.remove( user.getUsername() );  
  41.             }  
  42.         }  
  43.     }  
  44.   
  45. }  

public static HashMap<String,HttpSession> sessionMap = new HashMap<String,HttpSession>();

这个HashMap是用来存储用户的登陆信息,一个账户同时只能被一个人使用。


接着是demo的首页面,里面很简单,只有一个超链接,让其访问到 

${pageContext.request.contextPath}/login


这边笔者也是简化的不能再简化了,直接连账户名密码也不用填。直接登陆上。。。。。。

再来我们看LoginServlet.Java ------------------------------>判断这个账号是否被其他人登陆的逻辑判断


代码如下

  1. import javax.servlet.ServletException;  
  2. import javax.servlet.annotation.WebServlet;  
  3. import javax.servlet.http.HttpServlet;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6. import javax.servlet.http.HttpSession;  
  7. import java.io.IOException;  
  8.   
  9. /** 
  10.  * Created by HuLuo on 2016/8/20. 
  11.  */  
  12. @WebServlet(urlPatterns = "/login")  
  13. public class LoginServlet extends HttpServlet  
  14. {  
  15.     @Override  
  16.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  
  17.     {  
  18.         User user = new User();  
  19.         HttpSession session = req.getSession();  
  20.         /** 
  21.          * 该账号已经被登陆 
  22.          */  
  23.         if(null != SessionListener.sessionMap.get( user.getUsername() ))  
  24.         {  
  25.             /** 
  26.              * 将已经登陆的信息拿掉,将新的用户登录信息放进去 
  27.              */  
  28.             ForceLogoutUtils.forceUserLogout( user.getUsername() );  
  29.   
  30.             SessionListener.sessionMap.put( user.getUsername(), session );  
  31.         }  
  32.         /** 
  33.          * 该账号未被登陆 
  34.          */  
  35.         else  
  36.         {  
  37.             SessionListener.sessionMap.put( user.getUsername(), session );  
  38.         }  
  39.         session.setAttribute( "users", user );  
  40.         req.getRequestDispatcher( "result.jsp" ).forward( req,resp );  
  41.     }  
  42. }  

然后我们接着讲ForceLogoutUtils.java

这个类呢是用来,当发现账号已经被人登陆了,就将这个已经登陆上的人的Session从SessionListener.java中的HashMap里给拿到,并且移除在此HashMap中的记录

并将session  invalidate掉。



  1. import javax.servlet.http.HttpSession;  
  2. import java.util.Enumeration;  
  3.   
  4. /**  
  5.  * Created by HuLuo on 2016/8/20.  
  6.  */  
  7. public class ForceLogoutUtils  
  8. {  
  9.     public static void forceUserLogout(String username)  
  10.     {  
  11.         if(SessionListener.sessionMap.get( username ) != null)  
  12.         {  
  13.             HttpSession session = SessionListener.sessionMap.get( username );  
  14.   
  15.             SessionListener.sessionMap.remove( username );  
  16.   
  17.             Enumeration e = session.getAttributeNames();  
  18.   
  19.             while(e.hasMoreElements())  
  20.             {  
  21.                 String sessionName = (String) e.nextElement();  
  22.   
  23.                 session.removeAttribute( sessionName );  
  24.             }  
  25.   
  26.             session.invalidate();  
  27.         }  
  28.     }  
  29. }  
在LoginServlet.java处理的结果出来之后,跳转到一个result.jsp这个页面


页面内容也是只有一个超链接。检查自己是否被踢下

<%--           以下的超链接用于检验自己登陆的被踢下,被踢下了返回到index.jsp页面        --%>
    <a href="${pageContext.request.contextPath}/check">检验</a>

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2016/8/20
  Time: 11:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>


<body>


<%--           以下的超链接用于检验自己登陆的被踢下,被踢下了返回到index.jsp页面        --%>
    <a href="${pageContext.request.contextPath}/check">检验</a>
</body>
</html>


如果被踢下返回到index.jsp页面,如果没有被踢下,就继续留在result.jsp

是否被踢下


最后我们来看CheckServlet.java里面的逻辑判断


  1. import javax.servlet.ServletException;  
  2. import javax.servlet.annotation.WebServlet;  
  3. import javax.servlet.http.HttpServlet;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6. import java.io.IOException;  
  7.   
  8. /** 
  9.  * Created by HuLuo on 2016/8/20. 
  10.  */  
  11. @WebServlet(urlPatterns = "/check")  
  12. public class CheckServlet extends HttpServlet  
  13. {  
  14.     @Override  
  15.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  
  16.     {  
  17.         User user = (User) req.getSession().getAttribute( "users" );  
  18.   
  19.         if(null == user)  
  20.         {  
  21.   
  22.             resp.sendRedirect( "index.jsp" );  
  23.         }  
  24.         else  
  25.         {  
  26.             resp.sendRedirect( "result.jsp" );  
  27.         }  
  28.   
  29.     }  
  30. }  

判断从Session中拿到,是否有users信息,如果有继续留在result.jsp页面,如果没有重定向到index.jsp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javaweb实现一个账号只能同时被一个人使用(Java实现) 的相关文章

随机推荐

  • 单片机c51中断 — 中断键控流水灯

    项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章 中断 在第4章的实例2中 按键检测是采用查询法进行的 其流程图如图所示 问题是这样的 由于查询法 按键查询 标志位修改及彩灯循环几个环节是串联关系 当CPU运行于彩灯
  • java 远程从FTP服务器下载文件到本地

    package com cassiatwig liuliangqianbao util import org apache commons net ftp FTPClient import org apache commons net ft
  • HTTP慢速拒绝服务攻击(Slow HTTP Dos)

    HTTP慢速拒绝服务攻击简介 HTTP慢速攻击是利用HTTP合法机制 以极低的速度往服务器发送HTTP请求 尽量长时间保持连接 不释放 若是达到了Web Server对于并发连接数的上限 同时恶意占用的连接没有被释放 那么服务器端将无法接受
  • 如何c语言看字节大小,如何计算C语言结构占用的字节数

    全部展开 结构的数据类型很多 我们不会一long而就 让我们直接看一下相同数据结构的几种书写格式 格式一 01 struct tagPhone 02 03 char A 04 int B 05 short C 06 Phone 格式二 01
  • Matlab统计分析 -- 聚类算法模型

    统计分析 聚类算法模型 距离分析 数据标准化 欧氏距离与量纲有关 因此 有时需要对数据进行预处理 如标准化等 在MATLAB中的命令是zscore 调用格式 Z zscore X 输入X表示N行p列的原始观测矩阵 行为个体 列为指标 输出Z
  • vofuria的开发(4)更换目标图片(target)

    1 首先进入vuforia的官网 接下来的操作就很简单了 如下图中所示 这里如果你不是Unity开发就选择SDK下载 里面有一个 bat的文件一个 xml的文件 将文件放到将这两个文件放到 vuforia sdk Android sampl
  • [Error] invalid operands of types ‘int‘ and ‘double‘ to binary ‘operator%‘

    在运行下面的代码时 编译器报错 Error invalid operands of types int and double to binary operator include
  • SpringMvc ModelAndView 视图解析器和Servlet详解

    一 设置ModelAndView对象 根据View的名称 和视图解析器跳转到指定的页面 页面 视图解析器的前缀 view name 视图解析器的后缀
  • 前端Vue自定义顶部导航栏navBar 导航栏搜索框searchBar 导航栏右侧菜单按钮button

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • RBAC权限模型

    权限 权限 是用户可以访问的资源 包括页面权限 操作权限和数据权限 页面权限 页面权限 即用户登录系统可以看到的页面 由菜单控制 菜单包括一级菜单 二级菜单 只有用户有一级菜单 二级菜单的权限 那么用户就可以访问页面 操作权限 操作权限 即
  • 二、UPC-A

    UPC A 1 概述 UPC A 条码是美国较常用也较被广泛认可的条码类型 它主要用于零售行业 例如杂货店 UPC A 由统一杂货产品代码委员会与 IBM 联合开发 2 条码的组成 UPC A 条码由 12 位组成 开头是个单数字系统字符
  • Java热编译热部署插件:JRebel

    修改代码时 会经常遇到一个问题 就是要修改代码 虽然如果是html css js这些会立即生效但是像Java代码还是不行 只要涉及到代码或者配置什么的要重启服务 类似与我修改一个文件 但是想要生效要不然就是单个文件重新run一下 或者服务器
  • day24第三阶段总结

    day24 三阶段总结 课程目标 对第三模块 阶段的知识点进行总结和考试 更好的掌握此模块的相关知识 课程概要 知识补充 阶段总结 思维导图 考试题 1 知识点补充 1 1 并发编程 网络编程 从知识点的角度来看 本身两者其实没有什么关系
  • RS232 485 CAN端口浪涌、脉冲保护电路

    常见端口保护电路记录 实现保护等级 如果需要更高的防护等级需要其他电路配合 由于工作比较忙 有时候查起来太麻烦了 特此记录一下方便查询 模块评估版实物图 实现的保护等级如下 下面是zlg的rsm232完整保护电路 各个器件截图 GDT 气体
  • 使用httpclient 请求报错 :Software caused connection abort: recv failed

    Software caused connection abort recv failed java net SocketException Software caused connection abort recv failed at ja
  • DVWA靶场在sql注入联合查询时返回报错信息 “Illegal mix of collations for operation ‘UNION’ ”之解决

    比如我们输入 1 union select 1 table name from information schema tables where table schema dvwa 会跳出一个页面出现报错提示 Illegal mix of c
  • Form表单、四种常见的POST请求提交数据方式、MIME【转】

    浏览器行为 Form表单提交 1 form表单常用属性 action url 地址 服务器接收表单数据的地址 method 提交服务器的http方法 一般为post和get name 最好好吃name属性的唯一性 enctype 表单数据提
  • 浅析安全框架-Shiro和Spring Security

    一 权限概述 1 什么是权限 权限管理 一般指根据系统设置的安全策略或者安全规则 用户可以访问而且只能访问自己被授权的资源 不多不少 权限管理几乎出现在任何系统里面 只要有用户和密码的系统 权限管理分类 访问权限 管理员有增删改查权限 普通
  • 令AxosoftPowerTrack支持中文

    AxosoftPowerTrack是个有意思的vs netAdd in
  • javaweb实现一个账号只能同时被一个人使用(Java实现)

    大家在登陆qq的时候 电脑上登陆了qq 如果另一台机器上也登陆该qq账号 那么之前的qq账号会被挤下去 我们现在用web的方式来做一个非常简单的演示 先简单的说一下功能吧 用户只有一个User 这个entity设置成账号为hello 密码w