
//登錄頁面 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>
