Jsp & Servlet 會話控制
最後更新:2017-02-28
來源:互聯網
上載者:User
js|servlet|控制 Jsp & Servlet 會話控制
作者:guipei
前言
作為J2EE的重要組成部分的jsp和servlet規範中,會話(session)處理佔有非常重要的位置。目前,很多資料都非常詳細的講解了會話跟蹤如何處理。但是,針對會話控制卻很少有人涉及,原本在servlet規範中,servlet提供了HttpSessionContext介面處理會話控制功能,但是,在Servlet API 2.1以後,這個功能被取消了,參考原文(As of Java(tm) Servlet API 2.1 for security reasons, with no replacement. This interface will be removed in a future version of this API.)。
在本文中,作者會給你介紹一種會話控制的方法,採用listener技術,實現HttpSessionContext的功能替換。很多開發人員都會在部分場合方便得使用到這個功能完成某些任務,例如:線上人員資訊查看,線上人員控制等等功能。
分析
本文採用執行個體方式介紹會話控制功能。使用若干jsp頁面,和一個java類完成整個功能示範。詳見下表:
組件
功能
Com.guipei.listener. SessionListener
監聽組件,完成HttpSessionContext的功能
index.jsp
實現使用者登陸,建立新的session
logout.jsp
實現使用者退出,使用者自動刪除session
display.jsp
顯示使用者登陸資訊,在使用者登陸後自動轉入
session.jsp
列出當前所有的session
kill.jsp
殺掉指定的會話,使這個使用者串連無效
實現
監聽類com.guipei.listener.SessionListener 實現web application的監聽功能,它實現了HttpSessionListener介面,可以監聽sessionCreated(HttpSessionEvent se)和sessionDestroyed(HttpSessionEvent se) 方法,因此我們可以很容易的在session的建立和銷毀事件程序中處理session的控制。
在此類中,我們建立一個靜態執行個體變數Hashtable ht,採用Hashtable的一個好處是它是安全執行緒的集合類,無須我們再多做線程處理。採用這個collection類儲存我們所要控制的session對象。在監聽事件中容易的處理相關任務。
參看全部代碼:
package com.guipei.listener;
import java.util.Hashtable;
import java.util.Iterator;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
// 集合對象,儲存session 對象的引用
static Hashtable ht = new Hashtable();
// 實現HttpSessionListener介面,完成session建立事件控制
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
ht.put(session.getId(), session );
System.out.println("create session :" + session.getId() );
}
// 實現HttpSessionListener介面,完成session銷毀事件控制
public void sessionDestroyed(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
System.out.println("destory session :" + session.getId() );
ht.remove(session.getId());
}
// 返回全部session對象集合
static public Iterator getSet( ){
return ht.values().iterator();
}
// 依據session id返回指定的session對象
static public HttpSession getSession(String sessionId){
return (HttpSession)ht.get(sessionId);
}
}
頁面index.jsp 處理使用者登陸,建立新的會話的功能。在完成驗證後,跳轉到display.jsp頁面上。
<%@ page contentType="text/html; charset=gb2312" %>
<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->
<%
String strName = null;
String strThing = null;
try {
strName = request.getParameter("name");
strThing = request.getParameter("thing");
if ((strName == null) || (strName.length()==0)){
throw new Exception("null strName");
}
if ((strThing == null) || (strThing.length()==0))
throw new Exception("null strThing");
// add session
session.setAttribute("name",strName);
session.setAttribute("thing",strThing);
response.sendRedirect("display.jsp");
} catch (Exception e) {
}
%>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<center>Welcome</center>
<form method='post' >
<table align='center'>
<tr>
<td>name:</td>
<td> <input name='name' type='input'/> </td>
</tr>
<tr>
<td>thing:</td>
<td> <input name='thing' type='input'/> </td>
</tr>
<tr>
<td align='right'> </td>
<td align='right'>
<button type='submit'>submit</button>
<button type='reset'>reset</button>
</td>
</tr>
</table>
</form>
</body>
</html>
頁面display.jsp用於使用者登陸後的顯示功能,如果使用者沒有進行過登陸請求,會自動轉寄到index.jsp頁面,保證使用者登陸。
<%@ page language="java" pageEncoding="GB2312" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
if (session.isNew()==true){
response.sendRedirect("index.jsp");
}
out.println("name: "+ session.getAttribute("name") + "<br>");
out.println("thing: "+ session.getAttribute("thing") + "<br>");
out.println("session id: " + session.getId() + "<br>");
out.println("create time: " + session.getCreationTime() );
%>
</body>
</html>
頁面logout.jsp用於使用者退出登陸,採用主動方式銷毀session。
<%@ page language="java" pageEncoding="GB2312" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
if(session.isNew()!=true){
session.invalidate();
}
response.sendRedirect("index.jsp");
%>
</body>
</html>
頁面session.jsp列出當前會話使用者,並提供一個串連到kill.jsp,可以用作銷毀指定的會話操作。
<%@ page language="java" pageEncoding="GB2312" %>
<%@ page import= 'com.guipei.listener.*,java.util.*'%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
List session object
<br>
<table border='1'>
<tr bgcolor='yellow'>
<td>session id</td>
<td>user name </td>
<td>what thing </td>
<td>create time </td>
<td>operate</td>
</tr>
<%
Iterator iterator = SessionListener.getSet();
while(iterator.hasNext()){
try{
HttpSession session1 = (HttpSession)iterator.next();
out.println("<tr>");
out.println("<td>" + session1.getId() + "</td>" );
out.println("<td>" + session1.getAttribute("name") + "</td>" );
out.println("<td>" + session1.getAttribute("thing") + "</td>" );
out.println("<td>" + session1.getCreationTime() + "</td>" );
out.println("<td> <a href='kill.jsp?sessionid=" + session1.getId() +
"'>kill </a> </td>" );
out.println("</tr>");
System.out.println("list " + session1.getId());
}catch(Exception ex){
ex.printStackTrace();
return;
}
}
%>
</table>
</body>
</html>
頁面kill.jsp實現銷毀指定會話的功能,接收一個session id參數,從我們儲存的session對象集合中取得對應的session對象,調用invalidate方法,銷毀對象。
<%@ page language="java" pageEncoding="GB2312" %>
<%@ page import="com.guipei.listener.*"%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
// kill the session
try {
String strSid = request.getParameter("sessionid");
HttpSession session1 = SessionListener.getSession(strSid);
if (session1!=null){
session1.invalidate();
}
} catch (Exception e) {
e.printStackTrace();
}
response.sendRedirect("session.jsp");
%>
</body>
</html>
完成以上代碼後,還需要在web.xml描述中添加以下元素。使得SessionListener類可以發揮監聽功能。
<listener>
<listener-class>
com.guipei.listener.SessionListener
</listener-class>
</listener>
總結
作者不是很清楚,servlet規範為什麼要取消HttpSessionContext介面,儘管它聲明了取消的原因,但是我們仍然可以容易的通過HttpSessionListener介面實現這個功能。
希望本文可以提供一個新的方法,替換已經被servlet規範廢除的HttpSessionContext介面。讓我們可以方便的進行會話操作。