- JSP從零開始學(視頻教學版)
- 劉鑫編著
- 1696字
- 2021-03-12 12:32:01
4.3 session對象
在Web開發中,session對象同樣占據著極其重要的位置,在開發中它是一個非常重要的對象,可以用來判斷是否是同一用戶,還可以用來記錄客戶的連接信息等。HTTP協議是一種無狀態的協議(即不保存連接狀態的協議),每次用戶請求在接收到服務器的響應后,連接就關閉了,服務器端與客戶端的連接就被斷開。因此,當用戶的瀏覽器沒關閉,這個時候又發起請求,那么網站就應該識別出該用戶的情況。這種情況下,session對象就起到了關鍵作用。session相關概念見表4.3,常用方法見表4.4。
表4.3 session相關概念

表4.4 session對象常用方法

4.3.1 獲取session ID
獲取session對象ID可以判斷會話是否是同一會話,用戶可以通過會話中的信息來進行相關的操作。
【例4.8】獲取session ID值
【程序結構】創建兩個Web目錄并部署應用,頁面之間通過超鏈接聯系起來。
假設有3個頁面:ex4_2.jsp, ex4_3.jsp, ex4_4.jsp。ex4_2.jsp和ex4_3.jsp部署在同一應用下,ex4_4.jsp在另外一個應用中。ex4_2.jsp通過表單提交到ex4_3.jsp, ex4_2.jsp通過超鏈接指向ex4_4.jsp。ex4_3.jsp通過超鏈接指向ex4_2.jsp, ex4_3.jsp也通過超鏈接指向ex4_4.jsp。ex4_4.jsp通過表單提交到ex4_2.jsp。它們之間的關系如圖4.12所示。

圖4.12 頁面之間的關系圖
ex4_2.jsp發送請求和超鏈接到ex4_3.jsp和ex4_4.jsp,其源代碼如下:
-----------------ex4_2.jsp---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>My JSP 'ex4_2.jsp' starting page</title> 06 <meta http-equiv="pragma" content="no-cache"> 07 <meta http-equiv="cache-control" content="no-cache"> 08 </head> 09 <body> 10 <% 11 String sessionID = session.getId(); 12 session.setAttribute("name", "John"); //存參數name 13 String author = (String)session.getAttribute("author"); //強制轉為 String類型 14 long time = session.getCreationTime(); 15 Date date = new Date(time); 16 %> 17 <center> 18 <p>您訪問的是ex4_2.jsp頁面</br> 19 <%=author %>,您的session對象ID為:</br> 20 <%=sessionID%></br> 21 session對象創建時間:<%=date %> 22 </br> 23 </p> 24 <form action="ex4_4.jsp" method="post"> 25 <input type="submit" value="轉向ex4_3.jsp"/> 26 </form> 27 <a href="../ch04/ex4_4.jsp">歡迎到ex4_4.jsp頁面</a> 28 </center> 29 </body> 30 </html>
上述代碼中,第10~15行獲取session中author參數值,并設置當前日期,第19~20行顯示獲取的參數值,頁面效果如圖4.13所示。

圖4.13 ex4_2.jsp運行結果
從圖4.13中可以看出,頁面輸出了session對象的ID值和創建的時間,但是沒有獲得從頁面ex4_4.jsp傳來的參數值author。
ex4_4.jsp超鏈接到ex4_4.jsp和ex4_4.jsp,其源代碼如下:
-----------------ex4_3.jsp---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>My JSP 'ex4_3.jsp' starting page</title> 06 <meta http-equiv="pragma" content="no-cache"> 07 <meta http-equiv="cache-control" content="no-cache"> 08 </head> 09 <body> 10 <% 11 String sessionID = session.getId(); 12 String name = (String)session.getAttribute("name"); //強制轉為 String類型 13 long time = session.getCreationTime(); 14 Date date = new Date(time); 15 %> 16 <center> 17 <p>您訪問的是ex4_3.jsp頁面</br> 18 <%=name %>,您的session對象ID為:</br> 19 <%=sessionID%></br> 20 session對象創建時間:<%=date %> 21 </br> 22 </p> 23 <a href="ex4_2.jsp"><%=name %>,歡迎到ex4_2.jsp頁面</a></br> 24 <a href="../ch04/ex4_4.jsp"><%=name %>,歡迎到ex4_4.jsp頁面</a> 25 </center> 26 </body> 27 </html>
運行結果如圖4.14所示。從圖中可以看出,頁面ex4_3.jsp獲得的session對象ID和創建時間與ex4_2.jsp中的session對象ID和創建時間是一樣的,且獲得到了參數name的值。

圖4.14 ex4_4.jsp運行結果
ex4_4.jsp發送請求和超鏈接到ex4_2.jsp,其源代碼如下:
-----------------ex4_4.jsp---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>My JSP 'ex4_4.jsp' starting page</title> 06 <meta http-equiv="pragma" content="no-cache"> 07 <meta http-equiv="cache-control" content="no-cache"> 08 </head> 09 <body> 10 <% 11 String sessionID = session.getId(); 12 String name = (String)session.getAttribute("name"); //強制轉為 String類型 13 session.setAttribute("author", "Smith"); //存參數author 14 long time = session.getCreationTime(); 15 Date date = new Date(time); 16 %> 17 <center> 18 <p>您訪問的是ex4_4.jsp頁面</br> 19 <%=name %>,您的session對象ID為:</br> 20 <%=sessionID%></br> 21 session對象創建時間:<%=date %> 22 </br> 23 </p> 24 <form action="../ch04/ex4_2.jsp" method="post"> 25 <input type="submit" value="轉向ex4_2.jsp"/> 26 </form> 27 </center> 28 </body> 29 </html>
上述代碼中,第11~15行獲取session中的用戶名參數,第18~21行顯示參數值,頁面效果如圖4.15所示。

圖4.15 ex4_4.jsp運行結果
從圖4.15中可以看出,頁面輸出了session對象的ID值和創建時間,但是它和頁面ex4_2.jsp、ex4_3.jsp頁面的session對象的ID值不同,并且頁面沒有獲得從ex4_2.jsp傳來的參數值name。
從以上的結果可以看出:一個Web應用的session對象的ID值是唯一的,并且兩個應用之間的參數用session對象是獲取不到值的。
提示
讀者務必要理解session對象的生命周期。
4.3.2 登錄用戶信息的保存
【例4.8】登錄用戶信息的保存
【程序結構】login.jsp是用戶登錄界面,validate.jsp頁面是驗證用戶合法性界面,class.jsp頁面是登錄成功顯示班級管理界面,logout.jsp是退出登錄界面。它們之間的關系如圖4.16所示。

圖4.16 例4.8頁面之間的關系
login.jsp登錄頁面,其源代碼如下:
-----------------login.jsp---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <% 03 String path = request.getContextPath(); 04 String basePath = 05 request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+ path+"/"; 06 %> 07 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 08 <html> 09 <head> 10 <base href="<%=basePath%>"> 11 <title>用戶登錄</title> 12 <meta http-equiv="pragma" content="no-cache"> 13 <meta http-equiv="cache-control" content="no-cache"> 14 <meta http-equiv="expires" content="0"> 15 <meta http-equiv="keywords" content="keyword1, keyword2, keyword3"> 16 <meta http-equiv="description" content="This is my page"> 17 </head> 18 19 <body> 20 <center> 21 <font size="8">用戶登錄</font> 22 <hr/> 23 <form action="validate.jsp" method="post"> 24 用戶名稱:<input type="text" name="username"/> 25 <br/> 26 用戶密碼:<input type="password" name="password"/> 27 <br/> 28 <input type="submit" value="登錄"/> 29 </form> 30 </center> 31 32 </body> 33 </html>
上述代碼中,第23~29行用form表單提交登錄信息。
validate.jsp是驗證頁面,其源代碼如下:
-----------------validate.jsp---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>success.jsp</title> 06 <meta http-equiv="pragma" content="no-cache"> 07 <meta http-equiv="cache-control" content="no-cache"> 08 <meta http-equiv="expires" content="0"> 09 <meta http-equiv="keywords" content="keyword1, keyword2, keyword3"> 10 <meta http-equiv="description" content="This is my page"> 11 </head> 12 <%! 13 //聲明一個用戶集合,模擬從數據庫中取出用戶集 14 Map<String, String> map =new HashMap<String, String>(); 15 //聲明驗證的標識 16 boolean flag = false; 17 %> 18 <% 19 //向集合添加數據 20 map.put("John", "123456"); 21 map.put("Smith", "222222"); 22 map.put("Bob", "333333"); 23 map.put("Bruth", "666666"); 24 %> 25 <%! 26 //聲明驗證方法 27 boolean validate(String username, String password){ 28 String passwd = map.get(username); 29 if(passwd! =null&&passwd.equals(password)){ 30 return true; 31 }else{ 32 return false; 33 } 34 } 35 %> 36 <% 37 //獲得頁面提交的用戶名跟密碼 38 String username = request.getParameter("username"); 39 String password = request.getParameter("password"); 40 if(username==null||username==""||password==null||password==""){ 41 response.sendRedirect("login.jsp"); 42 } 43 flag = validate(username, password); 44 if(flag){ 45 //保存在session對象中 46 session.setAttribute("username", username); 47 session.setAttribute("password", password); 48 response.sendRedirect("class.jsp"); 49 } 50 %> 51 <body> 52 <center> 53 <font size="6">用戶登錄</font> 54 </center> 55 <br/> 56 <center> 57 <%if(! flag){ %> 58 <a href="login.jsp">重新登錄系統</a> 59 <%} %> 60 </center> 61 </body> 62 </html>
上述代碼中,第18~24行設置用戶集合;代碼第26~35行聲明驗證用戶合法性方法;第38~49行獲取參數值,并判斷其合法性,合法的保存在session中,否則跳轉到login.jsp中。
class.jsp是班級管理頁面,其源代碼如下:
-----------------class.jsp---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <% 03 String name = (String)session.getAttribute("username"); 04 if(name==null){ 05 response.sendRedirect("login.jsp"); 06 } 07 %> 08 09 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 10 <html> 11 <head> 12 <title>My JSP 'score.jsp' starting page</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1, keyword2, keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 </head> 19 20 <body> 21 <center> 22 <font size="5">班級管理</font> 23 <hr/> 24 <h3>學生:<%=name %></h3> 25 <table> 26 <tr> 27 <td> 28 <a href="addClass.jsp">班級錄入</a> 29 </td> 30 <td> 31 <a href="modifyClass.jsp">班級修改</a> 32 </td> 33 <td> 34 <a href="queryClass.jsp">班級查詢</a> 35 </td> 36 <td> 37 <a href="delClass.jsp">班級刪除</a> 38 </td> 39 </tr> 40 </table> 41 <a href="logout.jsp">退出登錄</a> 42 </center> 43 </body> 44 </html>
上述代碼中,第28~37行列出班級的各項方法。logout.jsp是退出頁面,其源代碼如下:-----------------logout.jsp----------------
01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <% 03 String username = (String)session.getAttribute("username"); 04 session.removeAttribute("John"); 05 session.invalidate(); 06 response.sendRedirect("login.jsp"); 07 %> 08 09 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 10 <html> 11 <head> 12 <title>My JSP 'logout.jsp' starting page</title> 13 </head> 14 <body> 15 </body> 16 </html>
【代碼解析】
login.jsp頁面中第23行代碼form表單用post方式提交,action指向success.jsp頁面。Validate.jsp頁面中第12~17行代碼是聲明map集合和成功標識flag,第18~24行向map中添加數據,第25~34行是驗證的方法,第36~50行是獲得頁面傳遞的參數以及驗證學生是否存在,如果存在則存放在session中并重定向到class.jsp。第57~59行驗證失敗則顯示重新登錄。logout.jsp頁面第2~6行獲得session中的name參數值并移除該學生,session失效。
運行結果如圖4.17所示。

圖4.17 例4.8運行結果
提示
該例子用戶退出,只是用簡單的session.invalidate方法,在開發中經常是結合struts框架一起使用。
- Modular Programming with Python
- Kali Linux Web Penetration Testing Cookbook
- Android Jetpack開發:原理解析與應用實戰
- JavaScript:Functional Programming for JavaScript Developers
- React Native Cookbook
- Neo4j Essentials
- Python編程實戰
- WebRTC技術詳解:從0到1構建多人視頻會議系統
- Hands-On Full Stack Development with Go
- BIM概論及Revit精講
- Python 3.7從入門到精通(視頻教學版)
- Python Essentials
- Fastdata Processing with Spark
- Java程序設計基礎(第6版)
- After Effects CC案例設計與經典插件(視頻教學版)