浏览量实现

问题描述:

我想在当前的Web应用程序中添加一个浏览量功能。此页面视图基于查看页面的用户数量。它必须是唯一的,即我不能查看某个人的页面10000次,并将其记录为10000个视图,而只是记录1个视图。浏览量实现

我的问题是,我应该根据我的浏览量计算IP地址吗?如果不是,这样做的最好方法是什么?

我知道如果这个人已经登录到我的系统,我可以简单地使用存储在会话中的用户标识并检查记录,如果用户有/没有查看该页面并相应地更新。但对于“匿名”的观众来说,最好的方法是什么?

谢谢。

PS Youtube是怎么做到的?


阅读大多数评论在这里后,我仍然不知道,如果所提供的解决方案将帮助。举一个典型的例子:Youtube视频。他们将浏览量存储在持久性存储中,并确保它不会将同一用户录制两次。如果有匿名观众,它(以某种方式)确保(我知道这不是完全证明,或者是匿名观众)更新一次浏览量计数。它可以通过cookie(但是如果你删除它)或通过IP地址(但是如果你坐在公司防火墙后面,这没有帮助)做到这一点。有没有其他策略可以最好地帮助这个?

PS特别是对于用户浏览量(即您的youtube帐户),它可以告知有多少浏览者查看了您的个人资料。这是否有另一种获取综合浏览量的方法?

您可以使用cookie来识别匿名用户。有些会禁用cookies或删除它们,但它会给你一个更好的结果,实施起来很便宜。

基于IP的过滤的问题在于很多人都在防火墙后面,并且您可能无法统计单个防火墙后的多个用户的点击次数。

您可以创建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

但是对于匿名观众,我如何确定观众是否是唯一的,而不是淹没请求以增加观众人数? –

也许你可以开始寻找到一个完全不同的方向第一:如果您已经在使用谷歌分析(或类似),你可以使用它的API为当前页面提取页面视图数据。数据不会完全保持最新,但实现非常简单,可能已经完成了您所需的任务。

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。 –