java監聽器之實現在線人數顯示


在碼農的世界里只有bug才能讓人成長,The more bugs you encounter, the more efficient you will be!

java中的監聽器分為三種:ServletRequestListener、HttpSessionListener、ServletContextListener;

ServletRequest--請求,在客戶端對服務器發生請求(訪問)時發生,請求一次發生一次(不考慮請求轉發),

               請求結束,該對象銷毀;

HttpSession--會話,單個用戶在某段時間內(Tomcat默認為30min,可以設置),自第一次發生請求(訪問)

               時創建,直到過期,該對象銷毀;

ServletContext--上下文,該對象存在於服務器端,自服務器開啟時創建,直到服務器關閉該對象銷毀。

那么,就有這樣一個思路:一個用戶持續對網站的訪問,請求數會很多,但是該用戶多次請求的Session卻一

直都是一個(唯一性)。我們可以在第一次訪問時把Session對象的ID存到服務器(上下文),后面每一次請求的

時候,我們可以檢查,該請求的Session對象是否已經在服務器(上下文),如果在,說明這次請求和之前的某次

請求是同一個用戶,如果不在,那么將這個請求產生的新Session對象的ID存到服務器(上下文)。Session對象到

期,自然就被銷毀(可以看做用戶長時間每活動,被迫下線了),那么將這個SessionID所在的整條信息刪除,也

就是可以看做,當前訪問用戶減少一個。其實除了多次請求產生的Session具有唯一性之外,發出請求的設備也是

具有唯一性的,我們可以通過獲得設備的IP進行標識。我們可以將這兩個信息存到用戶類中,每個用戶對象都有這

兩個屬性,並且是唯一的。

1.ServletRequest監聽器

 1 public class Requestlisen implements ServletRequestListener {
 2 
 3     public void requestDestroyed(ServletRequestEvent arg0) {
 4         // TODO Auto-generated method stub
 5 
 6     }
 7 
 8     public void requestInitialized(ServletRequestEvent arg0) {
 9         // TODO Auto-generated method stub
10         System.out.println("-----request創建了-------");
11         HttpServletRequest request = (HttpServletRequest) arg0
12                 .getServletRequest();
13         if (arg0.getServletContext().getAttribute("userlist") == null) {
14             List<User> userlist = new ArrayList<User>();
15             arg0.getServletContext().setAttribute("userlist", userlist);
16         }
17         List<User> userlist = (List<User>) arg0.getServletContext()
18                 .getAttribute("userlist");
19         String id = request.getSession().getId();
20         User user = (User) Getuserbyid.finduser(userlist, id);
21         if (user == null) {
22             System.out.println("-----當前請求對象不存在於服務器-----");
23             System.out.println("------將當前用戶添加到服務器-----");
24             User newuser = new User();
25             newuser.setIp(request.getRemotePort() + "");
26             newuser.setSessionid(id);
27             userlist.add(newuser);
28             arg0.getServletContext().setAttribute("userlist", userlist);
29         }
30     }
31 }

在這個監聽器中,我們只需要在請求初始化的時候,根據這個請求產生的SessionID判斷,當前SessionID

所屬的用戶是否存在於服務器用戶列表中,如果不存在,就新建一個用戶(包含IP和SessionID信息),並

存入服務器用戶列表。當然當第一個用戶訪問服務器時,用戶列表是空的,為了防止出現空指針異常,我們

要在此時為服務器創建一個用戶列表。

2.HttpSession監聽器

 1 public class Sessionlisten implements HttpSessionListener {
 2     private int count;
 3     public void sessionCreated(HttpSessionEvent arg0) {
 4         // TODO Auto-generated method stub
 5         System.out.println("-----新建會話-----");
 6         count++;
 7         arg0.getSession().getServletContext().setAttribute("usercount", count);
 8     }
 9     public void sessionDestroyed(HttpSessionEvent arg0) {
10         // TODO Auto-generated method stub
11         count--;
12         arg0.getSession().getServletContext().setAttribute("usercount", count);
13         System.out.println("-----會話銷毀-----");
14         List<User> userlist = (List<User>) arg0.getSession()
15                 .getServletContext().getAttribute("userlist");
16         String id = arg0.getSession().getId();
17         User user = (User) Getuserbyid.finduser(userlist, id);
18         userlist.remove(user);
19         arg0.getSession().getServletContext()
20                 .setAttribute("userlist", userlist);
21         System.out.println("-------當前用戶從服務器刪除-----");
22     }
23 }

在Session對象監聽器中,當一個會話創建時(有新用戶訪問),我們設置訪問量加1,

當一個會話銷毀時,表示一個用戶掉線了,沒有對服務器進行訪問了,那么訪問量減1,並且我們通過當

前會話ID獲得這個用戶,並且將這個用戶從服務器用戶列表刪除。

下面是根據SessionID查詢用戶的功能類:

 1 public class Getuserbyid {
 2     public static Object finduser(List<User> userlist,String id){
 3         if(userlist!=null){
 4             for(User user:userlist){
 5                 if(user.getSessionid().equals(id)){
 6                     return user;
 7                 }
 8             }
 9         }
10         return null;
11     }
12 }

因為Session對象銷毀時之前,這個Session對象所屬的用戶信心必定是早就存到上下文對象中了(服務器用

戶列表),那么自然是存在的,我們就根據SessionID這個字段來遍歷所有用戶的SessionID屬性,從而找到

這個用戶,將其從列表刪除。

 

注意:監聽器創建之后要進行注冊,不然是不能夠起到監聽作用的。還有就是不要忘記寫一個頁面來展示一下

存在於用戶列表的所有用戶信息。

 1   <%
 2      List<User> userlist=(List<User>)request.getServletContext().getAttribute("userlist");
 3   %>
 4     在線人數:<%=userlist.size() %><br>
 5     
 6   <%
 7      if(userlist!=null){
 8          for (User user :userlist){
 9   %>
10              IP地址:<%=user.getIp() %>----sessionId:<%=user.getSessionid() %><br>
11 
12   <%
13     }}
14   %>
在線人數:2
IP地址:0:0:0:0:0:0:0:1----sessionId:18166147D09F290A25924ACF9753E19D  同一台電腦兩個瀏覽器訪問,IP自然相同
IP地址:0:0:0:0:0:0:0:1----sessionId:43C373670AF88EE244CBF7E6585F2285

完結撒花~~~~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM