Filter應用之分ip統計網站的訪問次數
ip |
count |
192.168.1.111 |
2 |
192.168.1.112 |
59 |
因為一個網站可能有多個頁面,無論哪個頁面被訪問,都要統計訪問次數,統計工作需要在所有資源之前都執行,所以使用過濾器最為方便。
因為需要分IP統計,所以可以在過濾器中建立一個Map,使用IP為key,訪問次數為value。當有使用者訪問時,獲取請求的IP,如果IP在Map中存在,
說明以前訪問過,那麼在訪問次數上加1,即可;IP在Map中不存在,那麼設定次數為1。
把這個Map放在ServletContextListener,在伺服器啟動時完成建立(使用監聽器),並只在到ServletContext中)。
Ø Map需要在Filter中用來儲存資料
Ø Map需要在頁面使用,列印Map中的資料
程式碼
index.jsp
<body> <h1>分IP統計訪問次數</h1> <table align="center" width="50%" border="1"> <tr> <th>IP地址</th> <th>次數</th> </tr> <c:forEach items="${applicationScope.ipCountMap }" var="entry"> < <td>${entry.key }</td> <td>${entry.value }</td> </tr> </c:forEach> </table> </body> |
IPFilter
publicclass IPFilter implements Filter { private ServletContext context; publicvoid init(FilterConfig fConfig) throws ServletException { context = fConfig.getServletContext(); .synchronizedMap(new LinkedHashMap<String, Integer>()); context.setAttribute("ipCountMap", ipCountMap); } @SuppressWarnings("unchecked") publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Map<String, Integer> ipCountMap = (Map<String, Integer>) context .getAttribute("ipCountMap"); if (count == null) { count = 1; } else { } context.setAttribute("ipCountMap", ipCountMap); } publicvoid destroy() {} } |
<filter> <display-name>IPFilter</display-name> <filter-name>IPFilter</filter-name> <filter-class>cn.itcast.filter.ip.IPFilter</filter-class> </filter> <filter-mapping> <filter-name>IPFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |