2010年7月3日 星期六

J2EE - session 會話監聽

透過監聽 HTTP 會話活動,可以明瞭目前在 WEB 上的 session 數量,或是屬性建立刪除時都可以得知。這章的繪畫監聽主要是針對當使用著第一次對本伺服器請求時建立一個 HttpSession 物件,以保持對該使用者的聯繫。

當你執行 HttpServletRequest 的 getSession 方法時,如果你已經不是第一次請求,也就是說使用者送出請求時的 cookie 已經有了第一次請求的 JSESSIONID,這時候就會從 WEB 容器就會透過這個 JSESSIONID 取出你的 Session 物件。

那如果是第一次請求的話,Web 容器就會建立一個新的 Session 物件並且寫入到 cookie,當建立新的 Session 物件時如果有個監聽事件就可以算出目前在伺服器上總共有多少個存活的 Session 了。


程式部分如下:
(一)
先建立一個 類別並實做 HttpSessionListener interface,並且必須實做該介面的兩個方法,其中再該類別內建立一個 類別變數 array,是一個 ArrayList 型態且存放了所以的 HttpSession 物件

public class httpSessionListener implements HttpSessionListener
{
public static ArrayList array = new ArrayList();
public void sessionCreated(HttpSessionEvent se) {
//session 物件建立時會呼叫此函式並傳入 HttpSessionEvent 物件
HttpSession session = se.getSession();
//透過傳入的事件變數取得被建立的 HttpSession 物件
array.add(session); //加到 ArrayList 裡
System.out.println("creatSession : " + session.getId());
}
public void sessionDestroyed(HttpSessionEvent se) {
//session 物件註銷時會呼叫此函式並傳入 HttpSessionEvent 物件
HttpSession session = se.getSession();
System.out.println("destorySession : " + session.getId());
array.remove(session);
}
public ArrayList getArray(){
return array;
}
}
完成之後可以撰寫 login.jsp 和 display.jsp


(二)
首先 login.jsp 主要是要讓 client 端進行登入的動作,其中帳密不限只要不為 null 或不為空即可
程式如下:
<form action="" method="post" > <%-- action="" 請求會發送到該JSP --%>
...
...
</form>

並在 JSP 裡撰寫一些 Scriptlets 以驗證是否為空或 null
<%
.....

user = request.getParameter("username"); //取得請求參數 username 的值
pswd = request.getParameter("password");
if(user == null || user.length() == 0){
throw new Exception("null user");
}
if(pswd == null || pswd.length() == 0){
throw new Exception("null pswd");
}
session.setAttribute("user", user); //設定 session 範圍屬性 "user"
session.setAttribute("pswd", pswd); //設定 session 範圍屬性 "pswd"
response.sendRedirect("display.jsp");
//如果沒拋出例外並設定屬性成功後即重新導向到 display.jsp
.....
%>


(三)
接著可以在 display.jsp 理面運用 EL 運算式語言印出 session 範圍的那兩個屬性

<html>
<body>
.....
USER : ${sessionScope.user}
PSWD : ${sessionScope.pswd}
.....
</body>
</html>

(四)
可以撰寫一個 manager.jsp 顯示出目前 web 容器內有多少存活的 session

先運用 JSP 的標準標籤建立 httpSessionListener 物件 :

<jsp:useBean id="sessionListener" class="fsc.sessionManager.listsner.httpSessionListener" scope="page" />

再用迴圈將所有的 session 印出來 :

<c:forEach var="map" items="${sessionListener.array}">

${map.id}

</c:forEach>


(五)
最後在撰寫 logout.jsp 以代表使用者登出,這是就要執行銷毀 session 的動作

<c:if test="${pageContext.session.new != true}">
<% session.invalidate(); %> //執行 session 的 invalidate 方法 以銷毀 session
</c:if>
<% response.sendRedirect("login.jsp"); %>

此案例在執行時 盡量用 IE 執行,在 FireFox、chrome 下不論登入多少次都只會產生一個 session 物件

可以在 IDE 執行時的 output 觀看 Session 被建立或是被刪除時在監聽器印出的字樣

沒有留言:

張貼留言