利用JSPsession物件保持住登入狀態
http協議本身是一種無狀態的協議,也就是客戶端連續傳送的多個請求之間沒有聯絡,下一次請求不關心上一次請求的狀態。
而實際運用中卻希望伺服器能記住客戶端請求的狀態,比如在網上購物系統中,伺服器端應該能夠識別並跟蹤每個登入到系統中的使用者挑選併購買商品的整個流程 。為此,web伺服器必須採用一種機制來唯一地標識一個使用者,同時記錄該使用者的狀態,這就要用到會話跟蹤技術。
Java Web使用Session來跟蹤會話和管理會話內的狀態。
Session物件是一個jsp內建物件,它在第一個jsp頁面被裝載時自動建立,完成會話期管理。
從一個客戶開啟瀏覽器並連線到伺服器開始,到客戶關閉瀏覽器離開這個伺服器結束,被稱為一個會話。當一個客戶訪問一個伺服器時,可能會在這個伺服器的幾個頁面之間反覆連線,反覆重新整理一個頁面,伺服器應當通過某種辦法知道這是同一個客戶,這就需要session物件。
當發生以下四種情形其中之一時,session物件中的資料便會清空 :
使用者關閉目前正在使用的瀏覽器程式。
關閉網頁伺服器。
使用者未向伺服器提出請求超過預設的時間,Tomcat伺服器預設為30分鐘。
執行程式結束session。
1.建立session變數
在JSP中不需要特別設定程式程式碼來建立使用者session,當程式使用了session物件時,便會自動建立session,而下面這行語句便是在session中新增變數資料的方式:
session.setAttribute(“變數名稱”,變數內容)
變數內容可為字串或者其他物件型別,接著讓我們來看看如何使用這個方法在session中設定變數資料:
<%
session.setAttribute(“id”,”編號”); //設定字串
session.setAttribute(“expire”,new Date(86400*10)); //設定日期
session.setAttribute(“level”,new Integer(3)); //設定整數
%>
2.返回session中的變數
在session中設定了變數資料後,在其他的各個網頁中便可使用getAttribute讀取其中的內容,此方法所返回的資料型別為物件(Object)型別,語法如下:
session.getAttribute(“變數名稱”)
3.返回所有session中的變數名稱
getAttributeNames()方法可以取出session中所有變數的名稱,其結果為一個列舉類的例項。語法為:
session.getAttributeNames()
4.清除session中的變數
removeAttribute()方法可以清除session中的變數資料,使用語法如下:
session.removeAttribute(“變數名稱”)
5.結束session
對於已經建立的session,可使用invalidate()方法將其結束,使用語法為:
session.invalidate()
其他的一些可能會用到的方法:
現在寫一個例項:通過session來記錄客戶的登入狀態:
index.jsp登入介面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="process_login.jsp" method="post">
使用者名稱:<input type="text" name="username">
密碼:<input type="text" name="password">
<input type="submit" value="submit">
<input type="reset" value="reset">
</form>
<a href="page1.jsp">1</a>
<a href="page2.jsp">2</a>
<a href="page3.jsp">3</a>
</body>
</html>
process_login.jsp處理登入資料,這裡知道輸入密碼是123都可以登入成功:
session.getAttribute()將會告訴page1.jsp檔案這個使用者是否登入成功了
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
if (password.equals("123")){
session.setAttribute("username",username);
}
response.sendRedirect("page1.jsp");
%>
logout.jsp登出
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
session.invalidate();
response.sendRedirect("index.jsp");
%>
page1.jsp, page2.jsp, page3.jsp大同小異顯示不同的頁面,用於驗證登入狀態的記錄(這裡僅以page1.jsp為例):
注意這裡的判斷邏輯是一種很有趣的寫法,把jsp程式碼和html程式碼完全融合起來了,不過我覺得這樣寫還是比較亂,寧願只用一個jsp程式碼段,裡面用out.println()在html中來實現顯示不同的內容
這裡主要是靠判斷session.username是否為空來判斷是否登入過了,並且傳遞相關的引數資訊
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
這裡是Page1<br>
<%if (session.getAttribute("username")==null){%>
使用者還沒有登入
<%}else {%>
已登入,使用者名稱:<%= session.getAttribute("username")%>
<%}%>
<br>
<a href="page1.jsp">page1</a>
<a href="page2.jsp">page2</a>
<a href="page3.jsp">page3</a>
<a href="index.jsp">login</a>
<a href="logout.jsp">logout </a>
</body>
</html>
可以看到,登入以後,不管跳轉到哪個頁面,使用者的登入狀態都沒有丟失
一旦logout登出以後,session.invalidate()方法被呼叫,session被銷燬,就跟蹤不到使用者的登入資訊了
同時,如果我採用另一個瀏覽器訪問同樣的頁面,以“2號使用者”為username登入,也會一直記錄到這個使用者的登入資訊(不過如果是同一種瀏覽器的話就不行了)