Filter笔记(二)—访问计数器

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。

仅供个人学习总结使用,错误在所难免。

猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/82287507