做過JAVA編程的都知道,在JAVA中有一種垃圾收集器的機制,當它運行時(通常在系統記憶體低到一定限度時自動運行),會回收不再使用的對象所佔用的記憶體,所以,在JAVA程式中,我們通常只考慮建立對象,而從不關心對象的清除。Finalize()是JAVA為類提供的一種特殊方法。垃圾收集器的工作過程大致是這樣的:一旦垃圾收集器準備好釋放無用對象佔用的儲存空間,它首先調用那些對象的finalize()方法,然後才真正回收對象的記憶體。通過使用finalize(),就可以在垃圾收集器運行期間進行一些特殊的工作。下面一例就說明了finalize()的一種巧妙用法。
現在的商業應用系統越來越多的採用WEB形式。在WEB形式應用中,每一次頁面訪問是獨立的,前後不相關聯,哪怕多個使用者在同一時刻訪問應用的同一個頁面,使用者相互之間也是不知道的。如果想要檢查當前有哪些使用者正在使用系統(如準備恢複資料備份或進行系統升級時,系統管理員都很希望知道這些資訊),該怎麼辦呢? 基於Servlet、Jsp技術的WEB伺服器提供了隱含的Session、Application對象,利用它可以幫開發人員實現一些資訊的持續儲存和共用。當使用者訪問一個WEB應用時,WEB伺服器會自動建立一個Session對象,該對象可以供使用者在會話期內在應用的所有頁面中共用資料; Application是WEB應用的一個全域對象。利用Session、Application對象,可以達到跟蹤所有使用者資訊的目的。
當使用者開啟瀏覽器開始請求WEB應用的登入頁面時,WEB服務即為該客戶建立一個session,此後,在session的timeout時間內,該客戶都使用這個session(timeout時間可設定,如Tomcat伺服器是在各應用的web.xml檔案中設定)。如果使用IE瀏覽器,Session與客戶IP地址、客戶程式進程ID所共同標識的串連有對應關係,相同IP地址、相同進程的視窗(如通過IE-檔案-建立-視窗 開啟的新視窗)具有同一個session,所以session可用於標識各個獨立的客戶應用串連。
下面是一個範例
為了方便處理,先建一個簡單類(user)用來表達使用者資訊及存放sessionId:
package com;
public class user {
public String name="";
public String sessionId="";
}
另一個類(testSession)用於處理使用者的login、logout等動作資訊,使系統可以跟蹤當前串連的使用者資訊。
package com;
import java.util.Vector;
import com.user;
public class testSession {
public user User;
private Vector vsid;
public testSession()
{
User=new user();
}
public boolean verify(String username,String password)
throws Exception //驗證使用者/密碼
{
return true;
}
public void setSessionVar(String sesid,Vector sid) {
this.User.sessionId=sesid;
this.vsid=sid;
}
private static synchronized void addappses(user puser,
Vector pvsid) { //記錄一個新串連的使用者
int pos=-1;
user l_user;
if (puser==null || pvsid==null)
return;
for(int i=0;i<pvsid.size();i++){
l_user=(user)pvsid.get(i);
if(l_user.sessionId.equals(puser.sessionId)){
pos=i;
break;
}
}
if(pos==-1){
pvsid.add(puser);
}
else{
pvsid.set(pos,puser);
}
}
private static synchronized void removeappses(user puser,
Vector pvsid) { //移除一個退出的使用者
int pos=-1;
user l_user;
if (puser==null || pvsid==null)
return;
for(int i=0;i<pvsid.size();i++){
l_user=(user)pvsid.get(i);
if(l_user.sessionId.equals(puser.sessionId)){
pos=i;
break;
}
}
if(pos!=-1){
pvsid.remove(pos);
}
}
protected void finalize() {
this.removeappses(this.User,this.vsid);
}
public boolean login(String username) throws Exception
{ //處理登入
this.User.name=username;
this.addappses(this.User,this.vsid);
return true;
}
public boolean logout() throws Exception
{ //處理登出
this. finalize();
this.User=null;
this.vsid=null;
return true;
}
}