﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-liyuyang-文章分类-java</title><link>http://www.blogjava.net/liyuyang/category/37264.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 14 Jan 2009 11:10:45 GMT</lastBuildDate><pubDate>Wed, 14 Jan 2009 11:10:45 GMT</pubDate><ttl>60</ttl><item><title>得到准确的在线人数统计－减少搜索引擎的干扰 (摘录)</title><link>http://www.blogjava.net/liyuyang/articles/251277.html</link><dc:creator>liyuyang</dc:creator><author>liyuyang</author><pubDate>Wed, 14 Jan 2009 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/liyuyang/articles/251277.html</guid><wfw:comment>http://www.blogjava.net/liyuyang/comments/251277.html</wfw:comment><comments>http://www.blogjava.net/liyuyang/articles/251277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyuyang/comments/commentRss/251277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyuyang/services/trackbacks/251277.html</trackback:ping><description><![CDATA[<h2 style="margin: 13pt 0cm"><span style="font-family: 黑体">本文摘录自<a href="http://www.blogjava.net/flyffa/archive/2006/12/14/87722.html">http://www.blogjava.net/flyffa/archive/2006/12/14/87722.html</a><br />
基本方法：</span> </h2>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">基本的方法，网上到处都是，在</span> java <span style="font-family: 宋体">中就是在</span> web.xml <span style="font-family: 宋体">注册一个</span> Listener <span style="font-family: 宋体">，如下：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;listener&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;xp.web.SessionCounter&lt;/listener-class&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;/listener&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt">SessionCounter.java <span style="font-family: 宋体">实现</span> javax.servlet.http.HttpSessionListener <span style="font-family: 宋体">接口，分别在</span> sessionCreated <span style="font-family: 宋体">方法和</span> sessionDestroyed <span style="font-family: 宋体">方法中处理</span> session <span style="font-family: 宋体">数目。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这样的方法有一定的问题：</span> </p>
<p style="margin: 0cm 0cm 0pt">1 <span style="font-family: 宋体">、对于真正从网页访问的和搜索引擎的</span> spider <span style="font-family: 宋体">无法区分。</span> </p>
<p style="margin: 0cm 0cm 0pt">2 <span style="font-family: 宋体">、当</span> Tomcat <span style="font-family: 宋体">重启时，加载了上次持久化的</span> session <span style="font-family: 宋体">时，无法准确计算在线数。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第二个问题我们可以不予考虑，这是</span> tomcat <span style="font-family: 宋体">容器实现不标准的问题，我们要解决的是的第一个问题，如何知道你的访问的是真实的。</span> </p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 16pt; font-family: 黑体">用 </span><span style="font-size: 16pt"><font face="Arial">js</font> </span><span style="font-size: 16pt; font-family: 黑体">绕过搜索引擎 </span></strong><span style="font-family: 宋体">：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">做过</span> pv <span style="font-family: 宋体">统计的都知道，可以用</span> script <span style="font-family: 宋体">的方式得到你真实的</span> pageView <span style="font-family: 宋体">数目，我们现在要做的就是这样的一件事情，我们在所有的页面都加入一段话：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;script type="text/javascript"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">document.write ("&lt;iframe src='/sessionCountServlet' width=0 height=0 frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=no&gt;&lt;/iframe&gt;");</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;/script&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">然后我们写上一个</span> servlet <span style="font-family: 宋体">来记录这些真正的访问者。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">import java.io.*;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">import javax.servlet.*;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">import javax.servlet.http.*;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">public class SessionCounterServlet extends HttpServlet {</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public SessionCounterServlet() {</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public void doGet(HttpServletRequest request,</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws IOException,</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletException {</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(request, response);</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public void doPost(HttpServletRequest request,</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws IOException,</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletException {</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(request, response);</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public void process(HttpServletRequest request,</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws IOException,</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletException {</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionCounter.put(request.getSession().getId());</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span style="background: silver">}</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">}</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们可以看到这个</span> servlet <span style="font-family: 宋体">只是做了一件事情，在</span> process <span style="font-family: 宋体">里面做了</span> <span style="background: silver">SessionCounter.put(request.getSession().getId());</span> <span style="font-family: 宋体">这个动作。</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们来看看我们的</span> SessionCounter <span style="font-family: 宋体">做了些什么：</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">import javax.servlet.http.*;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">import java.util.Hashtable;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">public class SessionCounter implements HttpSessionListener {</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public SessionCounter() {</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public static Hashtable m_real = new Hashtable();</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; private static long count = 0;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public void sessionCreated(HttpSessionEvent e) {</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count++;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public void sessionDestroyed(HttpSessionEvent e) {</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (count &gt; 0) {</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count--;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_real.remove(e.getSession().getId());</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public static long getSessionCount() {</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return count;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public static void put(String sessionId){</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_real.put(sessionId,"1");</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; public static int getRealCount(){</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return m_real.size();</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; }</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="background: silver">}</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们记录了一个静态的</span> hash <span style="font-family: 宋体">表来记录激活状态的</span> sessionid <span style="font-family: 宋体">，并在</span> session <span style="font-family: 宋体">销毁的时候将这个</span> sessionid <span style="font-family: 宋体">置为空。</span> </p>
<img src ="http://www.blogjava.net/liyuyang/aggbug/251277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyuyang/" target="_blank">liyuyang</a> 2009-01-14 14:57 <a href="http://www.blogjava.net/liyuyang/articles/251277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>