Filter访问计数器
package javaweb.web.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//请求计数器
public class CountFilter implements Filter {
//单线程线程池,避免多用户同时访问文件
private ExecutorService executorService = Executors.newSingleThreadExecutor();
//属性文件文件
private Properties requestCounterLog;
private File logFile;
//初始化方法
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取Web应用运行时的路径
String appPath = filterConfig.getServletContext()
.getRealPath("/");
//在运行时的路径下创建文本文件
logFile = new File(appPath, "RequestCount.txt");
if (!logFile.exists()) {
try {
logFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//创建属性文件,将统计结果放在属性文件中
requestCounterLog = new Properties();
try {
//让属性文件读取记录的日志
requestCounterLog.load(new FileReader(logFile));
} catch (IOException e) {
e.printStackTrace();
}
}
//Filter的主要操作
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//处理的时Http请求所以需要强转
HttpServletRequest httpRequest = (HttpServletRequest) request;
//获取到用户请求的URL
String Url = httpRequest.getRequestURI();
executorService.execute(()-> {
//获取到属性文件中某个URL的访问次数,这里的property是数字字符串,代表几次
String property = requestCounterLog.getProperty(Url);
//如果没有找到记录说明这个URL是第一次被访问
if (property == null) {
//既然是第一次访问就创建一条记录,第一次访问
requestCounterLog.setProperty(Url, "1");
} else {
//找到了说明这个URL是有访问记录的,但是不知道已经被访问了几次
int count = 0;
try {
//count就是已经被访问的次数
count = Integer.parseInt(property);
} catch (NumberFormatException ignored) {
ignored.printStackTrace();
}
//现在是最新的访问,所以访问次数要加一
count++;
//再把数字转换成字符串写进去
requestCounterLog.setProperty(Url, Integer.toString(count));
}
try {
//把写好的日志文件加载到属性文件中
requestCounterLog.store(new FileWriter(logFile), "Request Properties");//comments是属性文件的注释信息
} catch (IOException ignored) {
ignored.printStackTrace();
}
});
//继续下一个Filter
chain.doFilter(request,response);
}
@Override
public void destroy() {
//关闭线程池
executorService.shutdown();
}
}
web.xml配置
<filter>
<filter-name>RequestCount</filter-name>
<filter-class>javaweb.web.filter.CountFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RequestCount</filter-name>
<servlet-name>login</servlet-name>
</filter-mapping>
就是说每当这个Servlet要处理请求时,后台都会记录下来。就可以记录网站一天的接受的请求数量了
如下图:说明网站被访问了两次。这只是最简单的Filter。
仅供个人学习总结使用,错误在所难免。