//登錄頁面 login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="./js/jquery-3.5.1.min.js"></script> <script type="text/javascript" src="./js/vue.js"></script> <title>登錄</title> <% String msg = (String)(request.getAttribute("msg")==null?"":request.getAttribute("msg")); %> <script type="text/javascript"> function show(){ if('<%=msg%>'!=''){ alert('<%=msg%>'); } } </script> </head> <body style="text-align: center" οnlοad="show();"> <form action="${pageContext.request.contextPath}/login.do" method="post"> <table border="1"> <tr> <td align="center" colspan="2"> <h3>用戶登錄</h3> </td> </tr> <tr> <td align="right"> 用戶名 </td> <td align="left"> <input type="text" id="userName" name="userName"> </td> </tr> <tr> <td align="right"> 密 碼 </td> <td align="left"> <input type="password" id="password" name="password"> </td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" value="登錄"> <input type="reset" value="重置"> </td> </tr> </table> </form> </body> </html>
//主頁面 main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登錄成功</title> <script type="text/javascript" src="./js/jquery-3.5.1.min.js"></script> <script type="text/javascript" src="./js/vue.js"></script> </head> <% response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","No-cache"); response.setDateHeader("Expires", -1); response.setHeader("Cache-Control", "No-store"); String userName = ""; userName = (String)(session.getAttribute("userName")==null?"":session.getAttribute("userName")); %> <script type="text/javascript"> var count; var userMsg = ''; var i =0; function checkUserOnline(){ $.ajax({ type:"post", url:"${pageContext.request.contextPath}/checkUserOnline.do", dataType : "text", success:function(data){ userMsg = data; //alert(JSON.stringify(userMsg)) }, error:function(){ alert("獲取用戶信息失敗!"); clearInterval(count); reLogin(); } }); if(userMsg=='null'||userMsg==''|| userMsg == 'undefined'){ return; }else{ //alert(JSON.stringify(userMsg)); clearInterval(count); reLogin(); } } function reLogin(){ window.location = "login.jsp"; } function checkLogin(){ alert("檢查"); count = setInterval("checkUserOnline()",5000); } </script> <body onclick="checkLogin()"> <% if(!"".equals(userName)){ out.print("登陸成功!<br/>用戶名:<span id='userName'>"+userName+"</span><br/><input type='button' value='重新登陸' οnclick='reLogin();'/>"); } %> </body> </html>
//控制類 LoginController
package com.zjn.oneLogin.dengLu; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class LoginController{ /** * 用戶和Session綁定關系 */ public static final Map<String, HttpSession> USER_SESSION = new HashMap<String, HttpSession>(); /** * seeionId和用戶的綁定關系 */ public static final Map<String, String> SESSIONID_USER = new HashMap<String, String>(); @RequestMapping("/login") @ResponseBody public Map<String,Object>toLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{ //獲取請求命令 request.setCharacterEncoding("utf-8"); String servletPath = request.getServletPath();//獲取請求路徑 String uri = servletPath.substring(1, servletPath.lastIndexOf(".do")); try{ //登錄 if ("login".equals(uri)){ HttpSession session = request.getSession(); String userName = request.getParameter("userName"); String password = request.getParameter("password"); if (userName != null && !"".equals(userName.trim())){ //登錄成功 if (login(userName, password)){ //處理用戶登錄(保持同一時間同一賬號只能在一處登錄) userLoginHandle(request); //添加用戶與HttpSession的綁定 USER_SESSION.put(userName.trim(), session); //添加sessionId和用戶的綁定 SESSIONID_USER.put(session.getId(), userName); System.out.println("添加sessionId和用戶的綁定 ==="+session.getId()); System.out.println("用戶[" + userName + "] 已上線..."); session.setAttribute("userName", userName); session.removeAttribute("userMsg");//從session中移除用戶信息 //重定向到首頁 response.sendRedirect("main.jsp"); } //登錄失敗 else{ System.out.println("用戶[" + userName + "] 登錄失敗..."); request.setAttribute("msg", "登錄失敗,請重新登錄!"); //response.sendRedirect("login.jsp"); request.getRequestDispatcher("login.jsp").forward(request, response); } } else{ System.out.println("用戶[" + userName + "] 登錄失敗..."); request.setAttribute("msg", "登錄失敗,請重新登錄!"); //response.sendRedirect("login.jsp"); request.getRequestDispatcher("login.jsp").forward(request, response);//跳轉到用戶頁面,返回請求響應對象 } }else if ("reLogin".equals(uri)){ //重新登陸 HttpSession session = request.getSession(); String userName = (String)session.getAttribute("userName"); if (session != null){ //銷毀相關session //USER_SESSION.remove(SESSIONID_USER.remove(session.getId())); session.invalidate(); } if (userName != null && !"".equals(userName)){ System.out.println("用戶[" + userName + "] 已下線..."); } //重定向到登錄頁面 response.sendRedirect("login.jsp"); } } catch (Exception e){ System.out.println(e.getClass() + e.getMessage()); PrintWriter out = response.getWriter(); out.print("服務器內部錯誤!"); } return null; } /** * * Description:用戶登錄時的處理 <br> * @param request * @see */ private void userLoginHandle(HttpServletRequest request){ //當前登錄的用戶 String userName = request.getParameter("userName"); System.out.println("userName=="+userName); //當前sessionId //String sessionId = request.getSession().getId(); //刪除當前sessionId綁定的用戶,用戶--HttpSession //USER_SESSION.remove(SESSIONID_USER.remove(sessionId)); //刪除當前登錄用戶已綁定的HttpSession HttpSession session = USER_SESSION.remove(userName);//map中的remove方法返回刪除value值 if (session != null){ //刪除已登錄的sessionId綁定的用戶 SESSIONID_USER.remove(session.getId()); session.removeAttribute("userName"); session.setAttribute("userMsg", "您的賬號已經在另一處登錄,您被迫下線!"); } } /** * * Description: 模擬DB登錄判斷<br> * @param userName 用戶 * @param password 密碼 * @return * @see */ private boolean login(String userName, String password){ return ("peizhongxian".equals(userName) && "123456".equals(password)); } /** * 判斷用戶是否同時登陸同一個用戶 * * */ @RequestMapping(value="/checkUserOnline") @ResponseBody public void checkUserOnline(HttpServletRequest request,HttpServletResponse response) throws IOException{ HttpSession session=request.getSession(); PrintWriter out = response.getWriter(); out.print(session.getAttribute("userMsg")); } }
//監聽器 MyListener
package com.zjn.oneLogin.dengLu; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MyListener implements HttpSessionListener { /** * 實現HttpSessionListener接口監聽 監聽session的創建事件 */ public void sessionCreated(HttpSessionEvent se){ String sessionId = se.getSession().getId(); System.out.println("創建session sessionId= " + sessionId); } /** * 實現HttpSessionListener接口監聽 監聽session的銷毀事件 */ public void sessionDestroyed(HttpSessionEvent se){ String sessionId = se.getSession().getId(); System.out.println("sessionId========="+sessionId); //當前session銷毀時刪除當前session綁定的用戶信息 //同時刪除當前session綁定用戶的HttpSession LoginController.USER_SESSION.remove(LoginController.SESSIONID_USER.remove(sessionId)); System.out.println("銷毀session sessionId= " + sessionId); } }
//web.xml 文件
<listener> <listener-class>com.zjn.oneLogin.dengLu.MyListener</listener-class> </listener>