一、实现思想
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作用域实现用户登录挤掉之前登录用户代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java线程之锁对象Lock-同步问题更完美的处理方式代码实例、分享一个简单的java爬虫框架、java集合中list的用法代码示例等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!
接口说明 用户登录 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/user/1.0.0/login 是否需要登录 否 请求字段说明 参数 类型 请求类型 是否必须 说明 username string form 是 用户名 password string form 是 密码 响应字段说明 参数 类型 说明 user St
回顾 在上一章中,我们已经创建了数据库以及学会了使用它来存储用户以及 blog,但是我们并没有把它融入我们的应用程序中。在两章以前,我们已经看到如何创建表单并且留下了一个完全实现的登录表单。 在本章中我们将会建立 web 表单和数据库的联系,并且编写我们的登录系统。在本章结尾的时候,我们这个小型的应用程序将能够注册新用户并且能够登入和登出。 我们接下来讲述的正是我们上一章离开的地方,所以你可能要确
我对Laravel有点陌生,我已经设置了一个表用户,其中包含用户名和密码字段。 我的登录屏幕上有一个表单,其中正式声明了这些字段,我有一个函数是UserController: 我知道这是顺利的,因为如果我空白提交表单,我可以看到错误消息。 我已经删除了默认的用户认证。 当我提交时,我得到: 错误异常在EloquentUserProvider.php第114行:参数1传递给Illumate\Auth
Logging in users(用户登陆) loopback User Model 登陆 登陆 登出 第三方登陆系统 密码重置 登陆 调用 User.login() 方法实现 登陆/认证, 需要提供一个带有 password 和 email/username 属性的对象,作为函数的第一个参数, 方法返回一个 access token 代码案例: /** * 登陆方法 * @param {o
cmf_get_current_user_id() 功能 获取当前登录前台用户id 参数 无 返回 int用户 ID,0表示用户未登录
X1.0新增 sp_update_current_user($user) 功能: 更新session里当前登录用户的信息 参数: $user:当前登录用户的最新信息 返回: 无