分IP统计网站访问次数(过滤器实现) 我不是女神ヾ 2021-06-22 15:36 470阅读 0赞 # 统计网站访问次数 # ## 1. 说明 ## 网站统计每个IP地址访问本网站的次数。 预期效果: ![在这里插入图片描述][2019121109042350.png] ## 2. 分析 ## **① 确定用什么来统计网站的访问次数?** 因为网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,也就是说统计工作在任何的资源被访问之前都要执行,所以使用过滤器比较方便。而且我们的这个过滤器不需要任何的拦截操作,只需要统计次数就可以了。 **② 用什么来存储网站中每个IP的访问次数?** 我们需要用什么来装载统计数据呢?答案是`Map<String,Integer>`,我们可以在过滤器中创建一个Map,key就是IP地址,value就是对应IP地址访问的次数。 当有用户访问时,就获取请求的IP地址:如果这个IP在map中存在,就说明以前访问过,就在访问次数上+1;如果IP在map中不存在,就设置访问次数为1。 **③ Map怎么创建?存放在哪里?** 这个Map什么时候创建呢,我们可以使用监听器,也就是使用ServletContextListener,在服务器启动的时候完成创建,并且存放到ServletContext中。 ## 3. 代码 ## ### ① 创建资源 ### 首先我们创建一些资源,供访问使用。这里我新建两个jsp,随便写一些内容。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70] ### ② 创建监听器 ### 接下来创建一个监听器,让其在服务器启动的时候创建一个Map,并且保存到ServletContext中。 public class AListener implements ServletContextListener { /** * 在服务器启动时创建Map,保存到ServletContext中 */ public void contextInitialized(ServletContextEvent arg0) { // 创建Map Map<String, Integer> map = new LinkedHashMap<String, Integer>(); // 得到ServletContext ServletContext application = arg0.getServletContext(); // 把Map保存到application application.setAttribute("map", map); } } ### ③ 创建过滤器 ### 接下来创建一个过滤器,命名为AFilter。 web.xml的有关配置如下: <filter> <display-name>AFilter</display-name> <filter-name>AFilter</filter-name> <filter-class>com.veeja.web.filter.AFilter</filter-class> </filter> <filter-mapping> <filter-name>AFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> AFilter的代码如下,功能和具体的步骤都写在注释里: /** * 从application中获取Map. 从request中得到IP地址. 进行统计工作,结果保存到Map中 * * @author Veeja.Liu * @emial veejaliu@gmail.com * */ public class AFilter implements Filter { private FilterConfig config = null; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获取application中的map ServletContext application = config.getServletContext(); Map<String, Integer> map = (Map<String, Integer>) application.getAttribute("map"); // 从request中获取当前客户端的ip地址 String ip = request.getRemoteAddr(); // 查看Map中是否有这个IP对应的数据,如果有就把访问次数+1,再保存回去 if (map.containsKey(ip)) { int cnt = map.get(ip); map.put(ip, cnt + 1); } else { // 如果不存在,就设置访问次数为1 map.put(ip, 1); } // 把Map放回到application中,这一步的操作其实有没有都可以,因为我们获取的是引用的值 application.setAttribute("map", map); chain.doFilter(request, response); } /** * 在服务器启动的时候就会执行本方法,而且只执行一次 */ public void init(FilterConfig fConfig) throws ServletException { this.config = fConfig; } } ### ④ 创建一个显示页面 ### 最后我们创建一个show.jsp,用来显示我们的统计数据。 <body> <h1 align="center">显示结果</h1> <table align="center" width="60%" border="1"> <tr> <th>IP地址</th> <th>访问次数</th> </tr> <c:forEach items="${applicationScope.map }" var="entry"> <tr> <td>${entry.key }</td> <td>${entry.value }</td> </tr> </c:forEach> </table> </body> ## 4. 运行结果 ## 我们运行项目,浏览器中随便访问几个网页,然后查看访问show.jsp,看到,结果是完全OK的: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70 1] -------------------- 以上就是全部内容,谢谢你的阅读。 **如有纰漏,请不吝指出,不胜感激。** 如果你不沉下心来认真练习,所有的阅读都是白费的。 [2019121109042350.png]: /images/20210615/751809a32c07469fa7c1ae033a5536e7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70]: /images/20210615/479bfd1ec9204e1ca8a5bdd8f6eb1e2b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1NjUxMjc_size_16_color_FFFFFF_t_70 1]: /images/20210615/a600a3e04c3d483da211a6c471503574.png
还没有评论,来说两句吧...