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


    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,使其失效

  • 相关阅读:
    [币严区块链]数字货币交易所之比特币(BTC)钱包对接 | 自建节点JSON-RPC访问
    [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏
    一句话的设计模式
    在线捉鬼游戏开发
    华容道程序求解
    利用多态,实现一般处理程序(ashx)中的AOP(切面编程)
    客户端-服务器端互动比较与原生实例(比较ajax,server-sent event,websocket/netsocket)
    在线捉鬼游戏开发之三
    在线捉鬼游戏开发之三
    在线捉鬼游戏开发之三
  • 原文地址:https://www.cnblogs.com/javafucker/p/7726202.html
Copyright © 2020-2023  润新知