基于session的单点登陆

版权声明:小佳 https://blog.csdn.net/qq_37870901/article/details/83743847

1、第一次访问,登录成功

(1)登陆界面

<%@ 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="jquery-3.2.1/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
	function login() {
	
		var userInfo = {
				"uname":$("#userName").val(),
				"upsw":$("#userPwd").val()
				};
		$.getJSON("UserLoginServlet.action",userInfo,function(data){
			if(data.success){
					//需要完善
				  window.location.href = "${pageContext.request.contextPath}/HouseInfoShowServlet.action";
			}else{
				alert("用户名或密码错误,请重新输入");
				$("#userName").focus();
			}
		});
	}
</script>
<title>Insert title here</title>
</head>
<body>
<div>
	<input type="text" id="userName"/><br/>
	<input type="password" id="userPwd"/><br/>
	<button onclick="login()">登录</button>
</div>
</body>
</html>


2、根据用户名和密码检查是否有该session,如果有session中存入已登录信息,覆盖session

protected void doPost(HttpServletRequest request, HttpServletResponse response)              throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		String name=request.getParameter("Userame");
		String password=request.getParameter("password");
		System.out.println(name);
		System.out.println(password);
		//List<UserInfo> lists = Methods.selectNamePwd();
		UserInfo  info = Methods.selectNamePwd(name, password);
		ResultMsg result;
		if(info!=null) {
			checkUser(request);
			info.setUserName(name);
			HttpSession session = request.getSession();
			session.setAttribute("info", info);
			response.sendRedirect("HouseShow.action");
			result = ResultMsg.success();	
		}else{
			result = ResultMsg.failure("输入的密码不正确!请查证!");
			request.getRequestDispatcher("login.html").forward(request, response);
		}
		response.getWriter().write(JSON.toJSONString(result));
		/*for(UserInfo s2:lists) {
			String name1 = s2.getUserName();
			String password2 = s2.getUserPwd();
			if(name.equals(name1)&&password.equals(password2)) {
				response.sendRedirect("HouseShow");
			}else {
				request.getRequestDispatcher("login.html");
			}
		}*/
	}


3、如果没有添加session

private void checkUser(HttpServletRequest request) {
		String userName = request.getParameter("Userame");
		String userPwd = request.getParameter("password");
		//获取上次登录的session(如果有的话)
		HttpSession session = SessionInfo.USER_SESSION.get(userName+userPwd);
		if(session!=null) {
			//在上次登录的session中放入一条信息
			session.setAttribute("msg", ResultMsg.failure("该账号在另一处登录,是否重新登录"));
		}
		//此处有替换session的功能
		SessionInfo.USER_SESSION.put(userName+userPwd, request.getSession());
	}


4、跳转到data.jsp界面

request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		HttpSession session = request.getSession();
		UserInfo info =  (UserInfo) session.getAttribute("info");
		System.out.println(info.getUserName());
		String userName = info.getUserName();
		List<HouseInfo> houseInfos  = Methods.selectHouse(userName);
		session.setAttribute("houseInfos",houseInfos);		
		request.getRequestDispatcher("/WEB-INF/data.jsp").forward(request, response);


5、在该界面中循环访问checkLogin,获取信息

$(function() {
	setInterval(checkUserOnline, 5*1000);
});
function checkUserOnline() {
	$.getJSON("UserCheckLoginServlet.action",function(data){
		if(!data.success){
			alert(data.msg);
			//注销
			 window.location.href = "${pageContext.request.contextPath}/UserLogoutServlet.action";
		}
	});
}


6、如果发现已登录,跳转到注销servlet中

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("application/json");
		ResultMsg msg = (ResultMsg) request.getSession().getAttribute("msg");
		//表示未出现重复登录情况
		if(msg == null) {
			msg = ResultMsg.success();
		}
		response.getWriter().write(JSON.toJSONString(msg));
	}


6、在注销servlet中,使session实效,跳转到login.jsp

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//注销以后把 对象移除
		HttpSession session = request.getSession();
		UserInfo userInfo = (UserInfo) session.getAttribute("info");
		if(session == SessionInfo.USER_SESSION.get(userInfo.getUserName()+userInfo.getUserPwd())) {
			SessionInfo.USER_SESSION.remove(userInfo.getUserName()+userInfo.getUserPwd());
		}
		//移除session
		session.invalidate();
		  //重定向到登录页面login.jsp
        response.sendRedirect(request.getContextPath()+"/login.html");
	}

猜你喜欢

转载自blog.csdn.net/qq_37870901/article/details/83743847
今日推荐