官术网_书友最值得收藏!

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框架一起使用。

主站蜘蛛池模板: 应用必备| 郸城县| 大渡口区| 方山县| 霍城县| 渑池县| 隆德县| 晋州市| 河西区| 运城市| 佛冈县| 祥云县| 大同县| 监利县| 钦州市| 泰和县| 菏泽市| 钟祥市| 萍乡市| 新安县| 沭阳县| 杭锦旗| 突泉县| 游戏| 普洱| 延安市| 屏南县| 济宁市| 辰溪县| 永年县| 富阳市| 毕节市| 珲春市| 北流市| 舟曲县| 谷城县| 英吉沙县| 绵阳市| 永定县| 澄城县| 通化市|