Java web--Filter过滤器分IP统计访问次数

  分IP统计访问次数即网站统计每个IP地址访问本网站的次数。

  分析

  因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便。

  因为需要分IP统计,所以可以在过滤器中创建一个Map,使用IP为key,访问次数为value。当有用户访问时,获取请求的IP,如果IP在Map中存在,说明以前访问过,那么在访问次数上加1,即可;IP在Map中不存在,那么设置次数为1。

  那么问题来了!

  问题一:为什么使用Map存放?

  Map是一个由键值对组成的数据结构,其中所有的key组成一个set集合,所有的value组成一个List集合。且在集合中每个键是唯一的,保持了查找结果的一致性。

  问题二:把Map放在什么域中?

  因为Map中记录的是访问相关数据,因此要在服务器开启时就要创建Map,记录数据。要把这个Map存放到ServletContext中!

  1. 存储数据使用:Map,其中ip为键,访问次数为值。

IP           次数
192.168.51.2       66
192.168.51.4       88

2. 把Map放到ServletContext中

3. 使用过滤器来完成统计!
  * 获取ServletContext中的map
   > Map map = (Map)sc.getAttribute("map");
   > if(map == null) { map = new HashMap(); sc.setAttribute("map", map);}
  * 获取当前请求的IP地址:request.getRemoteAddr()
  * 使用IP为键,查看map中是否存在这个键
  * 如果IP在Map中存在,说明不是第一次访问,那么获取访问次数,再加1,然后保存回到map中
  * 如果IP在Map中不存在,说明是第一次访问,向map添加键值,键为IP,值为1。
4. 建立index.jsp,这个页面会获取ServletContext中的map,然后循环显示。

代码:

IpFilter.java

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 *分IP统计访问次数
 */
public class IpFilter implements Filter {
    private FilterConfig config;

    public void init(FilterConfig config) throws ServletException {
        this.config=config;
    }
    /*
     * 1. 获取Map
     * 2. 获取请求IP
     * 3. 查看IP在Map中是否存在
     *   4. 如果存在,把访问次数+1,再保存回去
     *   5. 如果不存在,添加键值,键为IP,值为1
     * 6. 放行!
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //获取ServletConfig
        ServletContext sc = config.getServletContext();
        //获取ServletContext中的map
        Map<String,Integer> map=(Map<String, Integer>) sc.getAttribute("map");
        //如果map不存在,说明这是第一次被访问
        if(map==null){
            //创建map
            map=new LinkedHashMap<String,Integer>();
        }
        //获取请求ip
        String ip = request.getRemoteAddr();
        //判断map中是否存在这个ip
        if(map.containsKey(ip)){
            //如果ip存在,说明这个IP已经访问过本站
            // 获取访问次数
            Integer count = map.get(ip);
            //把访问次数+1
            count++;
            //把新的访问次数保存回去
            map.put(ip, count);
        }else{
            //因为这个IP是第一次访问,所以值为1
            map.put(ip, 1);
        }
        //把map放入ServletContext中
    sc.setAttribute("map", map);
    //放行
    chain.doFilter(request, response);
    }
    public void destroy() {

    }
}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <h1>分IP统计</h1>

  <table border="1" width="60%">
    <c:forEach items="${applicationScope.map }" var="entry">
        <tr>
            <th>ip</th>
            <th>数量</th>
        </tr>
        <tr>
            <td>${entry.key }</td>
            <td>${entry.value }</td>

        </tr>
    </c:forEach>
    </table>
  </body>
</html>
    

时间: 2024-10-01 05:49:21

Java web--Filter过滤器分IP统计访问次数的相关文章

java web Filter过滤器解决乱码

package com.kt.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.Serv

学习笔记_过滤器应用_1(分ip统计网站的访问次数)

分ip统计网站的访问次数 ip count 192.168.1.111 2 192.168.1.112 59 统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer> 整个网站只需要一个Map即可! Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Ma

Java web----Filter之分ip统计网站的访问次数

统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer> 整个网站只需要一个Map即可! Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!) Map需要在Filter中用来保存数据 Map需要在页面使用,

springboot过滤器禁止ip频繁访问

1.编写一个过滤器: import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.

Java中Filter过滤器的使用

过滤器过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改.判断等,把不符合规则的请求在中途拦截或修改.也可以对响应进行过滤,拦截或修改响应.如下图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤.过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端.当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉.过滤

Java Web 获取客户端真实IP

Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方式一.客户端未经过代理,直接访问服务器端(nginx,squid,haproxy): 方式二.客户端通过多级代理,最终到达服务器端(nginx,squid,haproxy): 客户端请求信息都包含在HttpServletRequest中,可以通过方法getRemoteAddr()获得该客户端IP.此

【java web】过滤器filter

一.过滤器简介 过滤器filter依赖于servlet容器 所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求, 这一点,是拦截器无法做到的.在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或 者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts

java web filter 学习(2)

本文主要对filter的基本使用进行了讲解,其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 ,能实现对java web程序 客户端和服务器端消息的过滤,也就是在服务器段接受request之前,可以预先对request进行处理,或在客户端接受response之前,对response进行处理. Filter的使用非常灵活,是在"链"到客户端和服务器之间的,在需要时可以配置到客户端与

java web filter 基础

本文主要对Filter的使用进行讲解. 1.Filter是什么? Filter 技术是servlet 2.3 新增加的功能.Filter翻译过来的意思就是过滤器,能对客户端的消息进行预处理,然后将请求转发给其它的web组件,可以对ServletHttpRequest和ServletHttpResponse进行修改和检查.例如:在Filter中可以检查用户是否登录,对未登录的用户跳转到登陆界面. 2.过滤器快速入门 要定义一个过滤器,则需要实现javax.servlet.Filter接口,一个过滤