2

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

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

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

谢谢。

PS Youtube 是如何做到的?


在阅读了此处的大部分评论后,我仍然不确定提供的解决方案是否会有所帮助。举一个典型的例子:Youtube 视频。他们将页面浏览量存储在持久存储中,并确保它不会两次记录同一用户。如果有匿名观众,它(以某种方式)确保(我知道这不是完整的证据,或者是这样)匿名观众更新浏览量计数一次。它可以通过cookie(但如果你删除它)或通过IP地址(但如果你坐在公司防火墙后面,那将无济于事)。是否有其他策略可以最好地帮助解决这个问题?

PS特别是对于用户浏览量(即您的 youtube 帐户),它可以告诉有多少观众查看了您的个人资料。那是否有另一种获取网页浏览量的方法?

4

4 回答 4

1

也许您可以首先开始寻找一个完全不同的方向:如果您已经在使用 Google Analytics(或类似的),您可以使用它的 API 来获取当前页面的页面浏览数据。数据不会完全是最新的,但实施非常简单,可能已经满足您的需求。

于 2010-03-17T11:36:49.003 回答
1

您可以使用 cookie 来识别匿名用户。有些人会禁用 cookie 或删除它们,但它会给您带来更好的结果并且实施起来非常便宜。

基于 IP 的过滤的问题是很多人都在防火墙后面,并且您可能无法计算单个防火墙后面的多个用户的命中。

于 2010-03-17T11:01:39.013 回答
1

您可以创建过滤器,将其映射到“/*”。在此过滤器中,您可以在会话中存储有关用户的信息:

 HttpSession session = request.getSession(true);

 Integer ival = (Integer) session.getValue("knownuser");
 if (ival==null) {
     ival = new Integer(1);
     incrementUsersCounter ();
     session.putValue("knownuser", ival);
 }
于 2010-03-17T11:02:13.480 回答
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 文件我希望它有效

于 2010-03-17T11:49:00.200 回答