使用Filter过滤非法IP

使用Filter过滤非法IP

有些web系统中会遭受一些不友好的访问,例如在论坛中发送不健康的帖子,博客留言中骂人,这时可以将该用户的ip地址封掉,即该ip地址发出request请求后不进行处理,这时就可以使用Filter来实现。

首先创建一个IPUtil类,里面初始化一些要禁止的IP(实际开发中会从数据库中读取),有时也可将某些ip段屏蔽,例如:192.168.1.*,此时在该ip段内的用户是无法访问系统的,缺点是可能会屏蔽正常访问系统的用户。

package com.monkey1024.util;


import java.util.ArrayList;
import java.util.List;

public class IPUtil {

    private static List<String> ipList = new ArrayList<>();


    static {
        ipList.add("192.168.1.102");
        ipList.add("0:0:0:0:0:0:0:1");//本机的ip
    }

    public static List<String> getIpList() {
        return ipList;
    }
}

然后创建Filter过滤器来过滤ip,如果请求的ip在禁用ip段内,就会直接return,即该请求不会到达目标资源就会被response:

package com.monkey1024.filter;

import com.monkey1024.util.IPUtil;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.List;

@WebFilter(filterName = "Filter",urlPatterns = "/*")
public class Filter implements javax.servlet.Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String ip = req.getRemoteAddr();
        List<String> ipList = IPUtil.getIpList();
        System.out.println(ip);
        if (ipList.contains(ip)) {
            System.out.println("非法ip");
            resp.getWriter().write("非法ip");
            return;
        }
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

在项目的根目录下创建一个index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  hello
  </body>
</html>

启动tomcat,访问系统,被禁用的ip用户是无法访问index.jsp的