实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问。

实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问。
结构:
在这里插入图片描述

代码:
BlackListListener.java

@WebListener("/connect")
public class BlackListListener implements ServletContextListener {
    
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
    
    
        //获取监听器的servletContext对象
        ServletContext servletContext = sce.getServletContext();
        //通过blacklist.txt的相对路径,得到其绝对路径
        String realPath = servletContext.getRealPath("blacklist.txt");
        //通过realPath的真实绝对路径创建一个file对象
        File file = new File(realPath);
// BufferedReader由Reader类扩展而来,提供通用的缓冲方式文本读取,
// 其readLine从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
//
//  BufferedReader和BufferedWriter为默认带有缓冲的字符输出输入流,
// 因为有缓冲区所以效率比没有缓冲区的高。
        //设置bufferedReader对象初值为null
        BufferedReader bufferedReader =null;
        //创建数组对象objects
        ArrayList<String> objects = new ArrayList<>();
        try {
    
    
            //为bufferedReader对象赋值
            bufferedReader = new BufferedReader(new FileReader(file));
            //bufferedReader对象读取数据
            while (bufferedReader.read()!=-1){
    
    
                //将读取到的数据加入到objects中
                objects.add(bufferedReader.readLine());
            }

        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            try {
    
    
                bufferedReader.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
        //为servletContext中name="blacklist",赋值value=objects
        servletContext.setAttribute("blacklist", objects);
    }
    
}

BlackListFilter.java

@WebFilter("/connect")
public class BlackListFilter implements Filter {
    
    
    public void destroy() {
    
    
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
    //从servletContext中读取⽂件,request、response
        HttpServletRequest request =(HttpServletRequest)req;
        HttpServletResponse reponse =(HttpServletResponse)resp;

        //将从request中读取的数据设置为utf-8编码
        request.setCharacterEncoding("utf-8");
        //告知浏览器和服务器编码为utf-8
reponse.setContentType("text/html;charset=utf-8");
        //获取servletContext
        ServletContext servletContext = req.getServletContext();

        //获取黑名单blacklist数组并创建blackList对象
       List<String> blacklist = (List<String>) servletContext.getAttribute("blacklist");
        //从request请求中获取ip
        String ip=getIpAddress((HttpServletRequest) req);
        System.out.println("请求ip:"+ip);

        //如果存在,则拦截
        for (String s : blacklist) {
    
    
            if (ip.equals(s)){
    
    
                System.out.println("ip为"+ip+"为黑名单ip");
                servletContext.setAttribute("blackip",ip);
                reponse.setHeader("refresh", "2;url=" + request.getContextPath() + "/infog");
                return;

            }

        }
        servletContext.setAttribute("ip",ip);
        //拦截放行操作。
        chain.doFilter(req,resp);

    }

    public void init(FilterConfig config) throws ServletException {
    
    

    }

    public static String getIpAddress(HttpServletRequest request) {
    
    
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 ||
                "unknown".equalsIgnoreCase(ip)) {
    
    
            ip = request.getHeader("Proxy-Client-IP");
        }

        if (ip == null || ip.length() == 0 ||
                "unknown".equalsIgnoreCase(ip)) {
    
    
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 ||
                "unknown".equalsIgnoreCase(ip)) {
    
    
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 ||
                "unknown".equalsIgnoreCase(ip)) {
    
    
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 ||
                "unknown".equalsIgnoreCase(ip)) {
    
    
            ip = request.getRemoteAddr();
        }
        return ip;
    }

}


ConnectServlet.java

@WebServlet("/connect")
public class ConnectServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //通过request.getServletContext得到servletContext对象
        ServletContext servletContext = request.getServletContext();
        //并通过servletContext对象得到blacklist的值
        ArrayList<String> blacklist = (ArrayList<String>) servletContext.getAttribute("blacklist");
        Object ip = servletContext.getAttribute("ip");
        response.getWriter().println("ip:"+ip+"可以访问目标网页");

    }
}

SkipServlet.java

@WebServlet("/infog")
public class SkipServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       response.setContentType("text/html;charset=utf-8");
        ServletContext servletContext = request.getServletContext();
        String blackip = (String) servletContext.getAttribute("blackip");
        response.getWriter().println("你的ip:"+blackip+"已被拉入黑名单");
    }
}

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gy99csdn/article/details/114336738