1. 程式人生 > >Filter應用之分ip統計網站的訪問次數

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">

<

tr>

<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>