1. 程式人生 > >Session案例:使用者登入場景

Session案例:使用者登入場景

1. 描述

從登入頁面登入後,如果登入成功,那麼進入主頁;如果登入失敗,那麼進入到一個失敗的頁面。

2. 分析


(1) 首先有一個登入頁面login.html,提交登入後交給後臺去處理,後臺接收到以後交給LoginServlet專門處理登

錄的邏輯。如果登入失敗,就進入到一個失敗的頁面fail.html;如果登入成功,就進入主頁,主頁用一個Servlet

去顯示,比如:主頁IndexServlet,因為要顯示動態的資料。

(2) 要把LoginServlet中的使用者名稱傳遞給IndexServlet共享使用,就需要使用到域物件。Session域物件是合適

的,因為每一個使用者登入後,就會給每一個使用者分配唯一的session物件。比如:張三和李四分別用不同的瀏覽器

登入網站,登入時都要訪問LoginServlet。

① 當張三訪問LoginServlet的時候,就會建立一個session物件session1,在裡面存放資料,建立完物件之後,

Session的機制就會給session1分配一個ID,比如s001,這個ID生成後會返回給張三的瀏覽器,那麼張三就有了

Session的編號,當下次張三來拿資料的時候也可以拿到。

② 當李四訪問登入LoginServlet的時候,如果李四沒有編號,也拿不到張三的資料,只會重新建立一個Session

物件Session2,並存放一些資料,分配編號S002,把這個編號貼給李四的瀏覽器。

③ 所以張三和李四下次訪問的,都是訪問自己特有的一個物件,這就實現了每個人都擁有一個特有的域物件。

3. 實現

(1) 處理登入的邏輯

/*
 * 處理登入的邏輯
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		// 1.接收引數
		String userName = request.getParameter("userName");
		String userPwd = request.getParameter("userPwd");
		// 2.判斷邏輯
		if ("eric".equals(userName) && "123456".equals(userPwd)) {
			// 登入成功
			/*
			 * 分析: context域物件:不合適,可能會覆蓋資料。比如開始是張三,但李四登入後,就會把張三的資料覆蓋掉。
			 * request域物件:不合適,整個網站必須得使用轉發技術來跳轉頁面,如果直接訪問主頁,那麼登入資訊就會消失。登入之後就不能隨便訪問使用者主頁。也就是說如果要到首頁那麼每次都得登入。 
			 * session域物件:合適。
			 */
			/*
			 * 一、登入成功後,把使用者資料儲存session物件中
			 */
			// 1.建立session物件
			HttpSession session = request.getSession();
			// 2.把資料儲存到session域中
			session.setAttribute("loginName", userName);
			// 3.跳轉到使用者主頁
			response.sendRedirect(request.getContextPath() + "/IndexServlet");
		} else {
			// 登入失敗
			// 請求重定向
			response.sendRedirect(request.getContextPath() + "/fail.html");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

(2) 使用者主頁的邏輯

/*
 * 使用者主頁的邏輯
 */
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter writer = response.getWriter();
		String html = "";
		/*
		 * 接收request域物件的資料
		 */

		/*
		 * 二、在使用者主頁,判斷session不為空且存在指定的屬性才視為登入成功!才能訪問資源。 從session域中獲取會話資料
		 */
		// 1.得到session物件
		HttpSession session = request.getSession(false);
		if (session == null) {
			// 沒有登入成功,跳轉到登入頁面
			response.sendRedirect(request.getContextPath() + "/login.html");
			return;
		}
		// 2.取出會話資料
		String loginName = (String) session.getAttribute("loginName");
		if (loginName == null) {
			// 沒有登入成功,跳轉到登入頁面
			response.sendRedirect(request.getContextPath() + "/login.html");
			return;
		}
		html = "<html><body>歡迎回來," + loginName + ",<a href='" + request.getContextPath()
				+ "/LogoutServlet'>安全退出</a></body></html>";
		writer.write(html);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

(3) 安全退出邏輯

/*
 * 安全退出邏輯
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 三、安全退出: 不能登出Session物件,如果銷燬,不僅僅登出了登入的狀態,而且還把儲存的資料也丟失。
		 * 而應該刪除掉session物件中指定的loginName屬性值即可!
		 */
		// 1.得到session物件
		HttpSession session = request.getSession(false);
		if (session != null) {
			// 2.刪除屬性
			session.removeAttribute("loginName");
		}
		// 3.回來登入頁面
		response.sendRedirect(request.getContextPath() + "/login.html");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

(4) 登入頁面 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>登入頁面</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
    <form action="/login/LoginServlet" method="post">
    	使用者名稱:<input type="text" name="userName"/>
    	<br/>
    	密碼:<input type="text" name="userPwd"/>
    	<br/>
    	<input type="checkbox" name="vehicle" value="Car" checked="checked" /> 
    	<input type="submit" value="登入"/>
    </form>
  </body>
</html>

(5) 登入失敗頁面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>資訊提示頁面</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
    <font color='red' size='3'>親, 你的使用者名稱或密碼輸入有誤!請重新輸入!</font><br/>
    <a href="/login/login.html">返回登入頁面</a>
  </body>
</html>

4. 結果

(1) 登入失敗


(2) 登入成功