实现 MyFilter 类
在这一步中,你将学习如何实现 MyFilter
类,以统计每个 IP 地址的访问次数并更新 ipVisitMap
。
-
打开位于 /home/labex/project/IpProject/src/main/java/org/labex/filter
目录下的 MyFilter.java
文件。
-
将以下代码添加到 MyFilter
类中:
package org.labex.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;
@WebFilter("/*")
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 如有需要,进行初始化代码
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String ipAddress = httpRequest.getRemoteAddr();
ServletContext servletContext = httpRequest.getServletContext();
Map<String, Integer> ipVisitMap = (Map<String, Integer>) servletContext.getAttribute("ipVisitMap");
synchronized (ipVisitMap) {
if (ipVisitMap.containsKey(ipAddress)) {
ipVisitMap.put(ipAddress, ipVisitMap.get(ipAddress) + 1);
} else {
ipVisitMap.put(ipAddress, 1);
}
}
chain.doFilter(request, response);
}
public void destroy() {
// 如有需要,进行清理代码
}
}
这段代码从 ServletContext
中获取 ipVisitMap
,获取当前客户端的 IP 地址,然后相应地更新 ipVisitMap
。synchronized
块确保对 ipVisitMap
的更新是线程安全的。