Application作用域实现:当用户重复登录时,挤掉原来的用户

一、实现思想

1.application(ServletContext)是保存在服务器端的作用域,我们在application中保存两种形式的键值对:1:<userId, sessionId>,2:<sessionId, session>

2.每当一个用户登录时(将生成一个新的session),首先根据userId在application中查询sessionId:

  如果没有查询到sessionId,说明还没有用户登录此账号,那么将<userId, sessionId>和<sessionId, session>两个数据保存到application中

  如果查询到了sessionId,说明已经有用户登录了,那么将执行以下3个步骤:

    1)先拿到已经登录的那个session,使其失效

    2)再将原来的session从application中删除,将新的session保存到application中(<sessionId, session>)

    3)最后将原来的sessionId从application中删除,将新的sessionId保存到application(<userId, sessionId>)

二、实现登录功能的handler的编码

@RequestMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response, Map<String, Object> map) throws Exception{
String userName = request.getParameter("userName");
String password = request.getParameter("password");
HttpSession session = request.getSession();
ServletContext application = session.getServletContext(); //获取application User user = new User(userName, password);
User currentUser = userService.login(user);
if (currentUser == null) {
request.setAttribute("error", "用户名或密码错误");
return "login";
} String userId = String.valueOf(currentUser.getId()); //获取userId
map.put("currentUser", currentUser); //将user保存到session中,注意要使用@SessionAttributes注释
if(application.getAttribute("userId") == null){ //说明还没有用户登录
application.setAttribute(userId, session.getId()); //将sessionId保存到application
application.setAttribute(session.getId(), session); //将session保存到application
}else{ //说明已经有用户登录
String sessionId = (String) application.getAttribute(userId); //根据userId获取上一个用户的sessionId
HttpSession oldSession = (HttpSession) application.getAttribute(sessionId); //根据sessionId获取上一个用户的session
oldSession.invalidate(); //使oldSession失效
application.removeAttribute(oldSession.getId()); //将oldSession从application中移除
application.setAttribute(session.getId(), session); //将新的session保存到application
application.removeAttribute(userId); //将oldSession的id从application中移除
application.setAttribute(userId, session.getId()); //将新的session的Id保存到application
}
return "main";
}

三、总结

1.请注意为什么要特意使用<userId, sessionId>将sessionId保存起来?

  因为,当第二个用户登录时,我们要使第一个用户的session失效,就必须要拿到第一个用户的sessionId,所以我们需要将sessionId通过<userId, sessionId>的形式保存起来,才能通过userId找到第一个用户的sessionId,从而找到第一个用户的session,使其失效

Application作用域实现:当用户重复登录时,挤掉原来的用户的更多相关文章

  1. 作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户

    作用域通信对象:session session对象基于会话,不同用户拥有不同的会话.同一个用户共享session对象的所有属性.作用域开始客户连接到应用程序的某个页面,结束与服务器断开连接.sessi ...

  2. ASP.net 实现禁止用户重复登录

    本文先为大家介绍如何利用缓存Cache方便地实现此功能. Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局对象,作用的范围是整个应用程序,所有用户:而Session是 ...

  3. asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件

    原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...

  4. Web---Cookie技术(显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放))

    本章博客讲解: 1.Cookie基本用法演示 2.演示Cookie的访问权限 3.演示Cookie的删除 4.利用Cookie显示用户上次登录的时间 5.利用Cookie技术显示用户最近浏览的若干个图 ...

  5. 用户未登录或Session超时时重定向到登录页,不那么简单

    在网站开发中,我们经常有这样的场景出现: 情景1:对未登录的用户或没有权限的用户,当其想访问某个受限网页时,系统要能够自动转到登录页面.   情景2:对于用session保存用户状态的情况还有这样一种 ...

  6. WIN10登录时找不到Administrator用户

    前提:WIN才安装的系统登录时只看到admin用户看不到administrator用户 1. 按网上方法,进入[此电脑]--[管理]--[系统工具]--[本地用户和组]--[用户] 2. 双击打开Ad ...

  7. 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序。

    原文 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序. 本文的内容 已安装与配置的应用程序 删除配置的应用程序 安装与配置的应用程序^ 在介绍如何删除所 ...

  8. ASP.NET MVC实现一个用户只能登录一次 单用户登录

    现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许 ...

  9. iOS 创建一个在退出登录时可以销毁的单例

    一.单例简介 单例模式是在软件开发中经常用的一种模式.单例模式通俗的理解是,在整个软件生命周期内,一个类只能有一个实例对象存在. 二.遇到的问题 在平时开发使用单例的过程中,有时候会有这样的需求,在用 ...

随机推荐

  1. Python isinstance 与 instance 的用法

    instance: instance 属于python2的关键字,python2中如果一个类没有继承自object, 那么实例化出来的对象就是instance类型,否则就是class类型. isins ...

  2. JS脚本实现CSDN免登陆免关闭广告插件自动展开“阅读更多”内容

    最近在CSDN查资料,总是弹出以下弹窗,然后就自动跳转到登录页面,蛋疼! 于是重新捣腾了一下,修改了原来的脚本,最新的脚本代码如下: 温馨提示:在打开CSDN页面后立刻执行以下脚本即可免登陆免关闭广告 ...

  3. Python小白学习之路(二十三)—【生成器补充】

    生成器的一些补充 接着下鸡蛋和吃包子! 补充一:生成器只能遍历一次 (总是把生成器比喻成母鸡下鸡蛋,需要一个下一个,首先是下出来的鸡蛋不能塞回母鸡肚子里,其次是一个母鸡一生只能下一定数量的鸡蛋,下完了 ...

  4. h5文字超出,两行显示,超出显示省略号

    最近接到一个需求,要求商场导航里的文字最多显示两行,超出两行的省略号显示,查一些资料,又根据自己的需求,改了很多,直接上代码吧 <html> <head> <style ...

  5. 研究CondItem

  6. JAVA微信服务号开发简记

    现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.所以这边做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说明. 基本认证信息说明 ...

  7. Java配置分离之Spring远程配置

    访问我的博客 前言 集群应用的配置文件如果写在项目的 resources 目录下面,当遇到需要修改某一个配置值时,需要将集群的所有应用的配置信息进行修改,并且将机密的配置信息比如数据库账号密码如果不进 ...

  8. php 通过 strtr 方法来替换文本中指定的内容

    通过在文本中指定待替换的内容,如: [{name}] [{age}] 格式可以自己定义, 大概过程: 在文本中定义需要替换的文本内容: 以键值对的方式 组织数据(数组): 用 file_get_con ...

  9. <Think Python>中统计文献单词的处理代码

    def process_line(line, hist):    """Adds the words in the line to the histogram. Modi ...

  10. SSL编程(3).NET实现SSL服务端

      准备开发用数字证书 一般学习和开发调试场合,不会随便使用正式的SSL服务器证书的私钥.由于服务器验证对于SSL来说是必须的,SSL服务器端必须有拥有一个服务器 证书,即能够访问到证书的私钥.对于要 ...