明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

防范多人使用統(tǒng)一用戶上網(wǎng)與用戶非正常退出注銷問題

[摘要]1,不要完全靠session來控制,session會有一個失效時間,這個時間不宜設的太短,否則正常工作會受影響。用監(jiān)聽事件的方法也是不可取的,事實上這個事件也會等到session過期的時候才會觸發(fā)。...
1,不要完全靠session來控制,session會有一個失效時間,這個時間不宜設的太短,否則正常工作會受影響。用監(jiān)聽事件的方法也是不可取的,事實上這個事件也會等到session過期的時候才會觸發(fā)。
2,可以采用隱藏楨的方式來檢測用戶的在線,這個時間可以設的比較短。比如5分鐘。就像dev-club.com一樣。在這個楨里得到用戶名,當時的IP,以及訪問時間。記錄在application中。
3,當另有用戶來訪問的時候,就判斷在application的數(shù)據(jù),如果已經(jīng)有該用戶的訪問記錄,就按IP和時間來判斷,是否可以繼續(xù)。比如說IP不同,但時間隔了很久了,就允許訪問。
4,你還可以再寫一個后臺進程來對application中的過期數(shù)據(jù)進行清理。
5,對于使用代理或網(wǎng)關訪問的用戶判斷可以這樣,session對象有一個方法叫getId(),可以得到一個唯一的ID。即使使用同一IP來訪問,這個ID也是不同的,可以加以區(qū)分。

嗯。以上都是理論。我沒有做過。但應該是可行的。



原問題
xinlcao 于 2002-12-21 11:06:09 加貼在 Java程序設計 ←返回版面 
請高手幫忙,遇到兩個問題:
1、如何限制同一賬號在同一時間只能有一名用戶使用,即防止多人使用統(tǒng)一用戶上網(wǎng);
2、如何在用戶直接關閉瀏覽器而不是按退出按鈕時注銷用戶。
我不知道這兩個問題能否在b/s結構中很好的解決,請高手指點。
下面是我的想法和疑惑:
1、可以通過cookie或session取得用戶登陸的記錄,但由于http協(xié)議的連接不連續(xù),如果兩個用戶用同一賬號上網(wǎng),只要不是同時向服務器請求,就無法知道到底是不是合用同一賬號,曾想試著同時記錄用戶上網(wǎng)時的用戶名和ip地址,只要在一定時間內(nèi)登陸的同一用戶名對應的ip地址不同,即可認為是合用同一賬號,但又引出兩個新的問題:(1)如果兩個用戶在網(wǎng)吧上網(wǎng)或有代理服務器的內(nèi)部網(wǎng)上網(wǎng),則獲得的ip地址也可能相同;(2)如果一個用戶撥號上網(wǎng),突然計算機死機或突然網(wǎng)絡中斷,當他再次上網(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