采用过滤器方式实现IP防火墙

web.xml配置
  <filter>
    <filter-name>IPFILTER</filter-name>
    <filter-class>com.supconit.ticc3.util.common.IpFilter</filter-class>
  </filter>

  <!--定义filter拦截的地址-->
  <filter-mapping>
    <filter-name>IPFILTER</filter-name>
    <url-pattern>/datamonitor/founded/*</url-pattern>
  </filter-mapping>
自定义过滤器配置
public class IpFilter implements Filter {
    private static final Logger logger = Logger.getLogger(IpFilter.class);
    private static final Map<String,String> IP_MAP = new HashMap<>();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Properties pro = new Properties();
        FileInputStream in = null;
        try {
            String fileName = this.getClass().getClassLoader().getResource("ip_config.properties").getPath();
            in = new FileInputStream(fileName);
            pro.load(in);
            pro.forEach((k, v) -> {
                IP_MAP.put((String) k, (String) v);
            });
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("初始化过滤器的方法");
        logger.info("初始化过滤器的方法");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        String servletPath = req.getServletPath();
        logger.info("请求路径过滤信息路径为:" + servletPath);
        String ipAddress = findIpAddress(req);
        logger.info("请求IP地址为:" + ipAddress);
        if(IP_MAP.containsValue(ipAddress)){
            chain.doFilter(request,response);
        }else{
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json; charset=utf-8");
            PrintWriter writer = response.getWriter();
            Map<String, String> map = new HashMap<>();
            map.put("error", "IP没有权限");
            writer.write(map.toString());
        }

    }

    @Override
    public void destroy() {
        System.out.println("结束过滤器的方法");
        logger.info("结束过滤器的方法");
    }

    public static String findIpAddress(HttpServletRequest request){
        String ipAddress="";
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){
                    //根据网卡取本机配置的IP
                    InetAddress inet=null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    ipAddress= inet.getHostAddress();
                }
            }
            //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
                if(ipAddress.indexOf(",")>0){
                    ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
                }
            }
            return ipAddress;
        } catch (Exception e) {
            e.printStackTrace();
            ipAddress="127:0:0:1";
        }

        return ipAddress;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACL(Access Control List)和无状态分组过滤器是两个不同的概念。 ACL是一种基于IP地址、协议和端口号等规则的访问控制机制,它可以实现对网络流量的控制和过滤。ACL可以用来限制源IP地址、目的IP地址、协议类型、端口号等信息,从而控制网络流量的进出。ACL是无状态的,它只能根据预定义的规则来过滤网络流量,不能根据流量的状态来进行判断和过滤。 无状态分组过滤器是一种基于网络层和传输层头部信息的过滤机制,它可以实现对网络流量的控制和过滤。无状态分组过滤器可以根据源IP地址、目的IP地址、协议类型、端口号等信息来过滤网络流量,但它无法根据流量的状态来进行判断和过滤。无状态分组过滤器的主要功能是根据预定义的规则来过滤和阻止网络攻击和威胁。 作为防火墙,ACL和无状态分组过滤器都具有一定的优劣势: ACL的优点是配置简单、灵活、易于管理,尤其适用于对网络流量进行基本的访问控制和过滤。但ACL无法实现基于连接状态的控制和过滤,不能有效地防范一些高级网络攻击和威胁。 无状态分组过滤器的优点是能够有效防范高级网络攻击和威胁、提供更精细的访问控制和过滤等,尤其适用于对网络连接进行高级控制和过滤。但无状态分组过滤器配置相对复杂,需要更高的技术水平和管理能力,同时也需要更多的资源和性能支持。 因此,在选择ACL还是无状态分组过滤器作为防火墙时,需要根据实际情况进行综合评估和考虑,如网络规模、安全需求、技术水平、资源和预算等因素。同时,也可以考虑将ACL和无状态分组过滤器结合起来使用,以实现更全面的网络安全保护和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值