1,不要完全靠session來控制,session會有一個失效時間,這個時間不宜設(shè)的太短,否則正常工作會受影響。用監(jiān)聽事件的方法也是不可取的,事實上這個事件也會等到session過期的時候才會觸發(fā)。 2,可以采用隱藏楨的方式來檢測用戶的在線,這個時間可以設(shè)的比較短。比如5分鐘。就像dev-club.com一樣。在這個楨里得到用戶名,當時的IP,以及訪問時間。記錄在application中。 3,當另有用戶來訪問的時候,就判斷在application的數(shù)據(jù),如果已經(jīng)有該用戶的訪問記錄,就按IP和時間來判斷,是否可以繼續(xù)。比如說IP不同,但時間隔了很久了,就允許訪問。 4,你還可以再寫一個后臺進程來對application中的過期數(shù)據(jù)進行清理。 5,對于使用代理或網(wǎng)關(guān)訪問的用戶判斷可以這樣,session對象有一個方法叫g(shù)etId(),可以得到一個唯一的ID。即使使用同一IP來訪問,這個ID也是不同的,可以加以區(qū)分。
嗯。以上都是理論。我沒有做過。但應(yīng)該是可行的。
原問題 xinlcao 于 2002-12-21 11:06:09 加貼在 Java程序設(shè)計 ←返回版面 請高手幫忙,遇到兩個問題: 1、如何限制同一賬號在同一時間只能有一名用戶使用,即防止多人使用統(tǒng)一用戶上網(wǎng); 2、如何在用戶直接關(guān)閉瀏覽器而不是按退出按鈕時注銷用戶。 我不知道這兩個問題能否在b/s結(jié)構(gòu)中很好的解決,請高手指點。 下面是我的想法和疑惑: 1、可以通過cookie或session取得用戶登陸的記錄,但由于http協(xié)議的連接不連續(xù),如果兩個用戶用同一賬號上網(wǎng),只要不是同時向服務(wù)器請求,就無法知道到底是不是合用同一賬號,曾想試著同時記錄用戶上網(wǎng)時的用戶名和ip地址,只要在一定時間內(nèi)登陸的同一用戶名對應(yīng)的ip地址不同,即可認為是合用同一賬號,但又引出兩個新的問題:(1)如果兩個用戶在網(wǎng)吧上網(wǎng)或有代理服務(wù)器的內(nèi)部網(wǎng)上網(wǎng),則獲得的ip地址也可能相同;(2)如果一個用戶撥號上網(wǎng),突然計算機死機或突然網(wǎng)絡(luò)中斷,當他再次上網(wǎng)時,由于撥號每次ip都可能不同,系統(tǒng)將把它當作另一個用戶處理。 2、想過制作一個記錄用戶登陸信息的類class UserLogin,然后啟動一個線程不停的定時查看登陸用戶的信息,根據(jù)一定的規(guī)則檢查用戶的合法性,但也無法解決上面的問題。 3、對于用戶非正常退出的注銷,曾試著用監(jiān)聽session的值來判斷: public class UserLogin implements HttpSessionBindingListener:聲明類時引入監(jiān)聽器 public void valueUnbound(HttpSessionBindingEvent e):獲得session時的事件 public void valueBound(HttpSessionBindingEvent e):獲得用戶登陸時向session寫入數(shù)據(jù)時的事件 一個用戶登陸時好判斷,只要從e中得到當時的session,然后從中獲得向session中寫入的變量和值,但是當用戶由于session失效退出時,又無法判斷,因為這時無法知道是哪個用戶退出了,從e中獲得的session已經(jīng)是實效的了。 先謝謝大家的幫忙!!!幫忙幫忙
參見:http://www.dev-club.com/club/bbs/showAnnounce.asp?id=1839973
|