浏览量实现
我想在当前的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);
}
也许你可以开始寻找到一个完全不同的方向第一:如果您已经在使用谷歌分析(或类似),你可以使用它的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文件,我希望它的工作原理
将所有会话保存在列表中是一个好主意吗?我认为这可能不理想?我们只需要一个计数而不是整个列表。 –
我同意平静的风暴。 @Giri,你在几个月前已经完成了你的工作。这就是所谓的会话计数器(在我的情况)。而不是持有一个列表,我有一个'static long'变量,当会话被分别创建/销毁时,它会增加/减少1。 –
好,和匿名用户? –
@The Elite Gentleman:无论用户是否登录,会话都将被创建。这只是cookie(或URL修改)。 – Roman
但是对于匿名观众,我如何确定观众是否是唯一的,而不是淹没请求以增加观众人数? –