Jsp & Servlet 會話控制

來源:互聯網
上載者: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介面。讓我們可以方便的進行會話操作。





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.