使用application範圍實現:當使用者重複登入時,擠掉原來的使用者

來源:互聯網
上載者:User

標籤:remove   login   gets   row   col   color   通過   範圍   總結   

使用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範圍實現:當使用者重複登入時,擠掉原來的使用者

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.