`

JAVAEE之单用户登录

阅读更多
单用户登录是系统中数据一直性的解决方案之一。

问题背景:
试想,如果同时有两个用户使用一个账号登录系统,
他们两个人需要对一批文章进行编辑。
都已经把同一篇文章读取到了浏览器中各自进行编辑后提交,
那么就会出现该文章只会保存一个人提交的结果。
先提交的那个人的将会被覆盖掉。


核心思想:
背景:由于每次请求的 sessionId 都不一样。
确保:每个用户名只能对应一个 session
方法:
在全局变量中维护一个 session 列表。
如果相同的用户名,出现不一样的 sessionId,
说明该用户进行了第二次登录,
则使原来存在的 session 失效(移除 session )。

页面可以加轮询次数(时间)控制,
无需等到用户下一次手动提交请求。


1、第一次登陆成功
    String userIdDecode = "登陆名";
    ServletContext context=null;
    context = this.getSession().getServletContext();   
    HttpSession session = this.getSession();
    Map<String,HttpSession> usersMap = (Map<String, HttpSession>) context.getAttribute("usersMap");
    //第一个用户登录时
    if(usersMap == null){
        usersMap = new HashMap<String,HttpSession>();     
        usersMap.put(userIdDecode, session);   
        context.setAttribute("usersMap", usersMap);   //将用户保存到ServletContext对象中   
    //非第一个用户登录   
    }else{
        if(usersMap.containsKey(userIdDecode)){
            logger.info("第二次登陆,remove掉"+userIdDecode);
            usersMap.remove(userIdDecode);
        }
        logger.info("添加当前用户到map"+userIdDecode);
        usersMap.put(userIdDecode, session);
    }
    this.setSessionValue("user", userIdDecode);

说明:
这里不用把整个session放到全局变量中,
可以只放一个 seesionId 即可。


2、拦截器拦截每一个请求路径,判断用户是否已经在别处登录
 

    //获取用户信息 
    HttpSession session = this.getSession(); 

    String user = (String)session.getAttribute("user");  
    System.out.println("当前登陆用户:"+user+"当前用户的sessionId"+session.getId()); 

    Map<String,HttpSession> usersMap = (Map<String, HttpSession>) session.getServletContext().getAttribute("users"); 
    if(null != usersMap){ 
        if(null == user){ 
            result = ""; 
            return null; 
        } 
        if(usersMap.containsKey(user)){ 
            if(session.getId().equals(usersMap.get(user).getId()))
                result = "true"; 
            else
                result = "false";
        }else { 
            if(null==usersMap.get(user)) 
                result = "true"; 
            else
                result = "false";
        } 
    }else{ 
        result = ""; 
    } 

    try { 
        ServletActionContext.getResponse().getWriter().print(result); 
    } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } 
    
    return null; 

    }


3、前台ajax轮询用户当前状态
//如果是在首页结束轮询
  var countTimeOut = 0;
  //轮询当前用户
  var t2 = window.setInterval("loadXMLDoc()",1000); 
  function loadXMLDoc()
  {
   countTimeOut = countTimeOut+1;
   if(countTimeOut == 1800){
    $.ajax({
            type:"post",
            url:"cleanSession",
            dataType : "text",
            error:function(){
                window.location.href="http://toIndex.action";
            }
         });
   }
   $.ajax({
          type:"post",
          url:"sessionLive",
          dataType : "text",
          success:function(data){check(data)},
          error:function(){
              window.location.href="http://toIndex.action";
          }
       });
  }

function check(result){
   if(result=="true"){
    }else{
     if(result=="false"){
     alert("您已经在别处登陆");
     $.ajax({
           type:"post",
           url:"cleanSession",
           dataType : "text",
           error:function(){
               window.location.href="http://toIndex.action";
           }
        });
     window.location.href="http://toIndex.action";
     }else{
      clearInterval(t2);
     }
    }
}
//轮询当前用户结束



4、清除当前session信息
    //获取用户信息 
    String user = (String)this.getSession().getAttribute("user"); 
    Map<String,HttpSession> usersMap = new HashMap<String, HttpSession>(); 
    HttpSession session = this.getSession();    
    usersMap = (Map<String, HttpSession>)session.getServletContext().getAttribute("users"); 
    if(null != usersMap){ 
        if(usersMap.containsKey(user)){ 
        if(session.getId().equals(usersMap.get(user).getId())) {         
            usersMap.remove(user); 
        } 
    }} 
    this.getSession().invalidate();


5、监听器
    application = event.getSession().getServletContext();
    Map<String,HttpSession> usersMap = new HashMap<String, HttpSession>();
    HttpSession session = event.getSession();    
    String user = (String)session.getAttribute("user");    
    usersMap = (Map<String, HttpSession>)application.getAttribute("users");
    if(null != usersMap){
        if(usersMap.containsKey(user)){
            if(session.getId().equals(usersMap.get(user).getId())){
                usersMap.remove(user);
            }
        }
    }
    //将session设置成无效   
    event.getSession().invalidate(); 
    System.out.println("一个Session被销毁了!"+user);   










-
分享到:
评论

相关推荐

    javaee的注册登录系统

    2. 用户登录:用户输入用户名和密码,然后系统将用户信息从数据库中检索出来,并进行身份验证。 JavaEE技术 该系统使用了JavaEE技术来实现注册登录功能。JavaEE是一个基于Java的企业级开发平台,提供了许多有用的...

    JavaEE 拦截器用户登录案例源代码

    在JavaEE开发中,拦截器...总之,`JavaEE 拦截器用户登录案例源代码`这个主题涉及到如何使用拦截器进行用户登录验证,通过学习这个案例,开发者可以更好地理解拦截器的原理和应用,提升Web应用的安全性和用户体验。

    JavaEE用户登录注册代码(免费)

    学习并实践这个“JavaEE用户登录注册代码”项目,可以帮助初学者掌握Web应用开发的基本流程,理解前后端交互,以及如何在实际环境中应用JavaEE的相关技术。同时,也可以锻炼到数据库操作、安全编程以及错误处理等...

    基于javaEE的登录

    综上所述,这个项目提供了一个基础的JavaEE Web应用实践,通过Tomcat服务器和MySQL数据库,展示了如何实现用户登录的基本功能,对于初学者来说,这是一个很好的起点,可以让他们理解JavaEE环境的搭建、数据库连接、...

    JavaEE企业级开发9.5用户登录

    在JavaEE企业级开发中,用户登录功能是任何应用程序的核心组成部分,它确保只有授权的用户能够访问受保护的资源。本教程将深入探讨9.5版本中的用户登录实现,涵盖关键概念和技术,包括身份验证、授权、会话管理以及...

    JavaEE Spring MyBatis框架(登录).rar

    JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring ...

    JavaEE MVC模式实现登录注册和用户增删改

    以上就是“JavaEE MVC模式实现登录注册和用户增删改”所涵盖的主要知识点,这些技术与实践对于理解JavaEE应用开发有着重要的意义。通过这个项目,开发者不仅可以掌握基本的Web开发技能,还能深入理解MVC模式以及如何...

    JavaEE用户管理系统

    在这个项目中,JSP可能会包含用户登录表单、个人信息展示等页面。 - **jQuery/AngularJS/Vue.js**:这些是常见的JavaScript库或框架,用于提升前端开发效率,实现更复杂的交互效果。例如,AngularJS可以用于双向...

    javaEE注册登录系统

    登录成功后,服务器会创建一个会话(session),保存用户的登录状态,并通过cookie在客户端保持会话。当用户请求其他页面时,服务器检查session来确认用户是否已登录。 8. **错误处理与页面重定向** 对于无效的...

    javaEE大作业-登录系统

    在本JavaEE大作业中,我们关注的是一个基础的登录系统的设计与实现。这个系统采用的是经典的分层架构,这是企业级应用开发中常见的模式,它有助于代码的组织和维护,提高了系统的可扩展性和可重用性。以下是该登录...

    DLOG4J JAVAEE多用户博客

    【标题】"DLOG4J JAVAEE多用户博客"是一个基于JAVA技术的Web应用程序,它采用了经典的SSH(Spring、Struts、Hibernate)架构,旨在实现一个支持多用户的博客平台。这个项目不仅提供了用户发布、阅读和评论博客文章的...

    javaEE实现人脸识别登录

    如果匹配度达到预设阈值,则认为识别成功,允许用户登录;否则,拒绝登录请求。 7. **安全性考虑**:为了保护用户隐私,存储的面部特征应该进行加密处理,并且不应存储原始图像。此外,定期更新API密钥,限制API...

    javaEE登录注册Mysql

    用的是MySQL数据库,自己建立一张user表就好了,只做了三列,ID,自增长,int;username,varchar;password,varchar;其他的日期什么的自己添加就好了,不是特别难,所有对数据库的操作都在servlet中

    基于JavaEE的多用户学生信息管理系统(MVC+JavaBean+servlet))

    这种权限控制通常通过session或cookie实现,根据用户登录时的角色分配不同的操作权限。 **5. 数据库连接与操作** 系统可能使用JDBC(Java Database Connectivity)来连接和操作数据库,如MySQL。通过...

    javaEE企业级开发SSM整合实现网站后台管理后台登录与院校管理.docx

    SSM框架整合简化了JavaEE应用的开发流程,通过Spring管理依赖,SpringMVC处理HTTP请求,MyBatis负责数据库操作。本实验通过创建实体类、控制层和业务逻辑,实现了后台管理系统的登录和院校管理功能,展示了SSM框架...

    JavaEE期末答辩总结.zip

    本资源摘要信息主要涉及JavaEE期末答辩总结,涵盖了JavaEE项目中的用户登录验证、登录功能的实现流程、持久对象层、数据访问层、业务逻辑层、Web表现层等内容。 一、用户登录验证 用户登录验证是JavaEE项目中的一...

    JavaEE Spring Struts2 Hibernate SSH2框架(登录).rar

    JavaEE Spring Struts2 Hibernate SSH2框架(登录例子) JavaEE Spring Struts2 Hibernate SSH2框架(登录例子) JavaEE Spring Struts2 Hibernate SSH2框架(登录例子) JavaEE Spring Struts2 Hibernate SSH2框架(登录...

    javaee登录项目源码

    用户登录案例需求: 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表 3.使用JdbcTemplate技术封装JDBC 4.登录成功跳转到...

    javaee网络工程期末大作业

    在大作业中,学生可能需要编写Servlet来处理用户请求,如登录验证、数据处理等。 3. **JSP(JavaServer Pages)**:JSP是一种动态网页技术,允许在HTML代码中嵌入Java代码。在项目中,JSP通常用于创建视图层,展示...

    javaee简单登录和增删查改

    查询(Read)操作通常用于显示用户信息,这可能在用户登录后自动进行,以便展示个人资料。 为了实现这些功能,开发者需要熟悉JSP、Servlet、JDBC以及相关的HTML和CSS知识。JSP可以用来创建动态网页,直接嵌入Java...

Global site tag (gtag.js) - Google Analytics