日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java session事件,Java开发网 - 再论Session事件的捕获

發布時間:2023/12/18 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java session事件,Java开发网 - 再论Session事件的捕获 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近又有網友問到,如何用Session實現在線統計的功能,其實只要對Servlet規范詳細了解一下,明白其基本原理,編寫一個類似的功能并不是一件很復雜的事情。我以前的一篇文章,最初也是發表在JavaResearch上的(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=2164),不過可能源碼沒有全部給出,只給出了最重點的源碼,所以還是有很多網友給我發信索取全部源碼。因為那個項目是以前做的,所以我手頭上也沒有原來的代碼了,所以可能有的網友的要求就滿足不了了,在這里一并致歉。

第一篇文章是基于Servlet2.2規范編寫的,那時候沒有HttpSessionListener,鑒于目前絕大多數的應用服務器都支持2.3的規范,所以為了回應網友的提問,特地又基于2.3以上的規范編寫了一個簡單的測試例子。

這個例子的最主要功能就是提供在線用戶列表顯示(既然用戶列表都可以顯示了,那人數統計自然也不在話下了)。

在給出代碼之前,先簡單說一下監聽器的常識。

HttpSessionListener:網友rdfei 在他的文章(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=18541)中也已經進行了比較詳細的描述,這是2.3以上規范所提供的一個新功能,也就是可以定義監聽器監聽HttpSession對象的創建和銷毀。每當有新的用戶訪問網站,應用服務器會創建一個HttpSession對象,每當Session超時,應用服務器則會銷毀這個對象。

HttpSessionBindingListener:每當往Session中存入一個對象(setAttribute)或從Session中刪除一個對象的時候,如果這個對象實現了此監聽器接口,應用服務器將會自動調用接口相應的方法。

需要注意的一點就是,在sessionDestroyed方法和valueUnbound方法中,你可以得到HttpSession對象的實例,但是其getAttribute方法不再可用,也就是在這兩個方法中,你不能再次得到存入session中的對象。

基于以上這些粗淺的認識,再簡單介紹一下我提供的測試例子的情況:

測試例子總共包含如下文件:

OnlineUserListener.java:它實現了HttpSessionListener接口

OnlineUsers.java:它包含了所有正在訪問網站的用戶信息,為了方便起見,它也實現了HttpSessionBindingListener接口(實際中你最好把他們分開吧)

User.java:這是用戶的信息

test.jsp:為了方便,我把登錄,退出,顯示在線用戶列表等功能都做在同一個jsp文件里了。

下面是具體的代碼:

/**

* OnlineUserListener.java

* Created on 2004-11-19

*/

package com.ccctc.view.web;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

/**

* @author litf

*

*/

public class OnlineUserListener

implements HttpSessionListener {

/**

* 瀏覽器第一次訪問的時候,調用本方法

* @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)

*/

public void sessionCreated(HttpSessionEvent event) {

User u = new User();

u.setName("guest");

u.setId(event.getSession().getId());

event.getSession().setAttribute("currentUser",u);

OnlineUsers.getInstance().addUser

;

}

/**

* Session超時的時候,調用本方法

* @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)

*/

public void sessionDestroyed(HttpSessionEvent event) {

OnlineUsers.getInstance().removeUser(event.getSession().getId());

}

}

/**

* OnlineUsers.java

* Created on 2004-11-19

*/

package com.ccctc.view.web;

import java.util.Collection;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

/**

* @author litf

* 在線用戶統計

*/

public class OnlineUsers implements HttpSessionBindingListener{

private Map users = new HashMap();

private static OnlineUsers onlineUsers = new OnlineUsers();

public static OnlineUsers getInstance(){

return onlineUsers;

}

/**

* @return

*/

public Collection getUsers() {

return users.values();

}

public void addUser(User user) {

users.put(user.getId(),user);

}

public void removeUser(String userId){

users.remove(userId);

}

/**

* 對象實例(即OnlineUserListener的實例)作為一個屬性被設置到session的

* 時候,會調用本方法,這種情況一般發生在點擊登錄按鈕以后的處理過程中

* 設置

* @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)

*/

public void valueBound(HttpSessionBindingEvent event) {

//現在暫時不需要額外處理,你可以在這里記錄日志等

}

/**

* 當Session超時,或本實例被從session中移除的時候被調用,這種情況一般

* 發生在注銷方法的處理過程中

* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)

*/

public void valueUnbound(HttpSessionBindingEvent event) {

try {

HttpSession session = event.getSession();

User u = (User)session.getAttribute("currentUser");

u.setName("guest");

} catch (RuntimeException e) {

//e.printStackTrace();

}

}

}

/**

* User.java

* Created on 2004-11-19

*/

package com.ccctc.view.web;

/**

* @author litf

*

*/

public class User{

private String address;

private String id;

private String name;

/**

* @see java.lang.Object#equals(java.lang.Object)

*/

public boolean equals(Object obj) {

if (obj == null || !(obj instanceof User)) {

return false;

}

if(this.id !=null && this.id.equals(((User)obj).getId())){

return true;

}

return false;

}

/**

* @return

*/

public String getAddress() {

return address;

}

/**

* @return

*/

public String getId() {

return id;

}

/**

* @return

*/

public String getName() {

return name;

}

/**

* @param string

*/

public void setAddress(String string) {

address = string;

}

/**

* @param string

*/

public void setId(String string) {

id = string;

}

/**

* @param string

*/

public void setName(String string) {

name = string;

}

/**

* @see java.lang.Object#toString()

*/

public String toString() {

return "name:"+name + ",id:" + id + ",address:"+address;

}

}

test.jsp

User u = (User)session.getAttribute("currentUser");

String name = request.getParameter("user");

if(u != null){

String remote = request.getRemoteAddr();

u.setAddress(remote);

}

//User Login

if(name != null){

if(u != null){

session.setAttribute("_listener",OnlineUsers.getInstance());

u.setName(name);

}

}

//User Logout

String logout = request.getParameter("logout");

if(logout != null){

session.removeAttribute("_listener");

}

%>

current users:

java.util.Collection l = OnlineUsers.getInstance().getUsers();

for(java.util.Iterator it = l.iterator(); it.hasNext()

{

User tu = (User)it.next();

if(u.equals(tu))

{

%>

:

}else{

%>

:

}

}

%>

User :

Logout

refresh

web.xml文件中增加:

com.ccctc.view.web.OnlineUserListener

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java session事件,Java开发网 - 再论Session事件的捕获的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。