基本方法:
基本的方法,網(wǎng)上到處都是,在
java
中就是在
web.xml
注冊(cè)一個(gè)
Listener
,如下:
<listener>
??? <listener-class>xp.web.SessionCounter</listener-class>
</listener>
SessionCounter.java
實(shí)現(xiàn)
javax.servlet.http.HttpSessionListener
接口,分別在
sessionCreated
方法和
sessionDestroyed
方法中處理
session
數(shù)目。
?
這樣的方法有一定的問題:
1
、對(duì)于真正從網(wǎng)頁(yè)訪問的和搜索引擎的
spider
無法區(qū)分。
2
、當(dāng)
Tomcat
重啟時(shí),加載了上次持久化的
session
時(shí),無法準(zhǔn)確計(jì)算在線數(shù)。
?
第二個(gè)問題我們可以不予考慮,這是
tomcat
容器實(shí)現(xiàn)不標(biāo)準(zhǔn)的問題,我們要解決的是的第一個(gè)問題,如何知道你的訪問的是真實(shí)的。
?
用
js
繞過搜索引擎
:
做過
pv
統(tǒng)計(jì)的都知道,可以用
script
的方式得到你真實(shí)的
pageView
數(shù)目,我們現(xiàn)在要做的就是這樣的一件事情,我們?cè)谒械捻?yè)面都加入一段話:
<script type="text/javascript">
document.write ("<iframe src='/sessionCountServlet' width=0 height=0 frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=no></iframe>");
</script>
然后我們寫上一個(gè)
servlet
來記錄這些真正的訪問者。
import java.io.*;
?
import javax.servlet.*;
import javax.servlet.http.*;
public class SessionCounterServlet extends HttpServlet {
??? public SessionCounterServlet() {
??????? super();
??? }
?
??? public void doGet(HttpServletRequest request,
????????????????????? HttpServletResponse response) throws IOException,
??????????? ServletException {
?
??????? process(request, response);
?
??? }
?
??? public void doPost(HttpServletRequest request,
?????????????????????? HttpServletResponse response) throws IOException,
??????????? ServletException {
?
??????? process(request, response);
?
??? }
?
??? public void process(HttpServletRequest request,
??????????????????????? HttpServletResponse response) throws IOException,
??????????? ServletException {
??????? SessionCounter.put(request.getSession().getId());
}
}
?
我們可以看到這個(gè)
servlet
只是做了一件事情,在
process
里面做了
SessionCounter.put(request.getSession().getId());
這個(gè)動(dòng)作。
我們來看看我們的
SessionCounter
做了些什么:
import javax.servlet.http.*;
import java.util.Hashtable;
?
public class SessionCounter implements HttpSessionListener {
??? public SessionCounter() {
??? }
?
??? public static Hashtable m_real = new Hashtable();
?
??? private static long count = 0;
?
??? public void sessionCreated(HttpSessionEvent e) {
??????? count++;
??? }
?
??? public void sessionDestroyed(HttpSessionEvent e) {
??????? if (count > 0) {
??????????? count--;
??????? }
??????? m_real.remove(e.getSession().getId());
??? }
?
??? public static long getSessionCount() {
??????? return count;
??? }
?
??? public static void put(String sessionId){
??????? m_real.put(sessionId,"1");
??? }
?
??? public static int getRealCount(){
??????? return m_real.size();
??? }
}
我們記錄了一個(gè)靜態(tài)的
hash
表來記錄激活狀態(tài)的
sessionid
,并在
session
銷毀的時(shí)候?qū)⑦@個(gè)
sessionid
置為空。
怎么把
servlet
配置到
web
應(yīng)用中我就不羅唆了。