Java 页面视图实现

Java 页面视图实现,java,pageviews,Java,Pageviews,我想在我当前的web应用程序上添加页面浏览功能。此页面视图基于查看页面的用户计数。它必须是唯一的,也就是说,我不能查看一个人的页面10000次并将其记录为10000次查看,只需记录1次查看即可 我的问题是,我应该根据IP地址计算页面浏览量吗?如果不是,那么最好的方法是什么 我知道,如果该用户已登录到我的系统,我可以简单地使用会话中存储的用户id,并检查该用户是否查看了该页面,并相应地进行更新。但对于“匿名”观众来说,最好的方法是什么 谢谢 PSYoutube是如何做到的 在阅读了这里的大部分评

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

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

我知道,如果该用户已登录到我的系统,我可以简单地使用会话中存储的用户id,并检查该用户是否查看了该页面,并相应地进行更新。但对于“匿名”观众来说,最好的方法是什么

谢谢

PSYoutube是如何做到的


在阅读了这里的大部分评论之后,我仍然不确定提供的解决方案是否会有所帮助。举一个典型的例子:Youtube视频。它们将页面视图存储在永久性存储器中,并确保它不会记录同一用户两次。如果有匿名查看器,它(以某种方式)确保(我知道这不是完全证明,或者是)匿名查看器更新页面视图一次。它可以通过cookie(但若你们删除了它怎么办)或IP地址(但若你们坐在公司防火墙后面,那个就没用了)。有没有其他策略可以最好地帮助这一点


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

您可以使用cookie来识别其他用户。有些会禁用cookie或删除cookie,但这会给您带来更好的结果,而且实现起来非常便宜

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

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

 HttpSession session = request.getSession(true);

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

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

JavaServletapi为我们提供了这方面的帮助 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文件我希望它能工作

@精英绅士:无论用户是否登录,都会创建会话。这只是cookies(或URL修改)。但是对于匿名查看者,我如何确定查看者是否是唯一的,而不是淹没请求以增加查看者数量?我们已经讨论了大约一个小时了。您最好阅读一些关于servlet、会话(我指的是java中的HttpSession)、过滤器的介绍手册。然后你就可以确定答案了。把所有的课程都列在一个列表中是个好主意吗?我认为这可能不理想?我们可以数一数,而不是整张单子。我同意@女孩,你做的我几个月前就已经做过了。它被称为会话计数器(在我的例子中)。我没有保存一个列表,而是使用了一个
静态long
变量,当创建/销毁会话时,该变量会分别增加/减少1。