2010-03-17 100 views
1

我想在當前的Web應用程序中添加一個瀏覽量功能。此頁面視圖基於查看頁面的用戶數量。它必須是唯一的,即我不能查看某個人的頁面10000次,並將其記錄爲10000個視圖,而只是記錄1個視圖。瀏覽量實現

我的問題是,我應該根據我的瀏覽量計算IP地址嗎?如果不是,這樣做的最好方法是什麼?

我知道如果這個人已經登錄到我的系統,我可以簡單地使用存儲在會話中的用戶標識並檢查記錄,如果用戶有/沒有查看該頁面並相應地更新。但對於「匿名」的觀衆來說,最好的方法是什麼?

謝謝。

PS Youtube是怎麼做到的?


閱讀大多數評論在這裏後,我仍然不知道,如果所提供的解決方案將幫助。舉一個典型的例子:Youtube視頻。他們將瀏覽量存儲在持久性存儲中,並確保它不會將同一用戶錄製兩次。如果有匿名觀衆,它(以某種方式)確保(我知道這不是完全證明,或者是匿名觀衆)更新一次瀏覽量計數。它可以通過cookie(但是如果你刪除它)或通過IP地址(但是如果你坐在公司防火牆後面,這沒有幫助)做到這一點。有沒有其他策略可以最好地幫助這個?

PS特別是對於用戶瀏覽量(即您的youtube帳戶),它可以告知有多少瀏覽者查看了您的個人資料。這是否有另一種獲取綜合瀏覽量的方法?

回答

1

您可以使用cookie來識別匿名用戶。有些會禁用cookies或刪除它們,但它會給你一個更好的結果,實施起來很便宜。

基於IP的過濾的問題在於很多人都在防火牆後面,並且您可能無法統計單個防火牆後的多個用戶的點擊次數。

1

您可以創建filter,將其映射到「/ *」。在此過濾器,你可以在會話存儲有關用戶:

HttpSession session = request.getSession(true); 

Integer ival = (Integer) session.getValue("knownuser"); 
if (ival==null) { 
    ival = new Integer(1); 
    incrementUsersCounter(); 
    session.putValue("knownuser", ival); 
} 
+0

好,和匿名用戶? –

+0

@The Elite Gentleman:無論用戶是否登錄,會話都將被創建。這只是cookie(或URL修改)。 – Roman

+0

但是對於匿名觀衆,我如何確定觀衆是否是唯一的,而不是淹沒請求以增加觀衆人數? –

1

也許你可以開始尋找到一個完全不同的方向第一:如果您已經在使用谷歌分析(或類似),你可以使用它的API爲當前頁面提取頁面視圖數據。數據不會完全保持最新,但實現非常簡單,可能已經完成了您所需的任務。

0

JAVA SERVLET API提供了我們在這個問題上 sessionCreated(HttpSessionEvent SE)和sessionDestroyed(HttpSessionEvent SE)。這些方法將被稱爲新會話已創建並且會話即將被銷燬的通知。 讓有servlet代碼如下

03.import javax.servlet.http.HttpSessionEvent; 
04.import javax.servlet.http.HttpSessionListener; 
05.import javax.servlet.http.HttpSession; 
06.import java.util.List; 
07.import java.util.ArrayList; 
08. 
09.public class SessionCounter implements HttpSessionListener 
10.{ 
11. private List sessions = new ArrayList(); 
12. 
13. public SessionCounter() 
14. { 
15. } 
16. 
17. public void sessionCreated(HttpSessionEvent event) 
18. { 
19.  HttpSession session = event.getSession(); 
20.  sessions.add(session.getId()); 
21. 
22.  session.setAttribute("counter", this); 
23. } 
24. 
25. public void sessionDestroyed(HttpSessionEvent event) 
26. { 
27.  HttpSession session = event.getSession(); 
28.  sessions.remove(session.getId()); 
29. 
30.  session.setAttribute("counter", this); 
31. } 
32. 
33. public int getActiveSessionNumber() 
34. { 
35.  return sessions.size(); 
36. } 
37.} 

顯示用戶的數量,我們將有一個JSP頁面如下

<html> 
<head> 
    <title>Session Counter</title> 
</head> 

<body> 
<% 
    SessionCounter counter = (SessionCounter) session 
      .getAttribute("counter"); 
%> 
Number of online user(s): <%= counter.getActiveSessionNumber() %> 
</body> 
</html> 

搭好web.xml文件,我希望它的工作原理

+0

將所有會話保存在列表中是一個好主意嗎?我認爲這可能不理想?我們只需要一個計數而不是整個列表。 –

+0

我同意平靜的風暴。 @Giri,你在幾個月前已經完成了你的工作。這就是所謂的會話計數器(在我的情況)。而不是持有一個列表,我有一個'static long'變量,當會話被分別創建/銷燬時,它會增加/減少1。 –