Session案例:使用者登入場景
阿新 • • 發佈:2019-02-19
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) 登入成功