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