Servlet-Filter实现反爬虫

以前用DotNetCore实现过反爬虫功能。在tomcat里面可以利用Servlet的Filter类实现请求的控制来达到反爬虫功能,进而增强JRT的web安全。

实现黑名单过滤器,对在黑名单列表的IP的所有请求都跳转到警告页面,业务各种请求自行定义加入黑名单

/*
本框架版权归属于JRT计划,任何单位或个人未经许可,不得以任何方式复制、传播、展示、发布、分发、重新分发、修改、反编译、
反向编译或以其他方式使用本框架的任何部分,包括但不限于源代码、二进制文件、文档、演示文稿、示例代码和API。
使用本框架的用户需遵守以下条款:
用户只能以个人学习和研究为目的使用本框架,不得将其用于商业用途。
用户在使用本框架时,应遵守所有适用的法律和法规,包括但不限于版权法、商标法、专利法和隐私权法。
用户在使用本框架时,应自行承担风险和责任,并确保不会侵犯任何知识产权或个人权利。
本框架的使用仅限于用户自己使用,不得将其分发给其他用户或将其用于任何形式的共享或传播。
在使用本框架时,用户应尊重和保护其他用户的隐私和个人信息,不得将其泄露给任何第三方。
违反以上条款将视为侵权行为,将采取法律手段维护JRT合法权益。
 */
package JRT.Core.Security;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

/**
 * 黑名单过滤器,实现拉黑
 */
public class BlackListFilter implements Filter {
    /**
     * 黑名单
     */
    public static HashMap<String, Long> BlackMap = new HashMap<>();

    /**
     * 访问这些url就拉黑
     */
    public static List<String> BlackUrl = new ArrayList<>();


    /**
     * 过滤器初始化
     *
     * @param filterConfig
     * @throws ServletException
     */
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * 执行筛选
     *
     * @param request  请求对象
     * @param response 响应对象
     * @param chain    传递链
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //访问ip
        String ip = request.getRemoteAddr();
        HttpServletRequest httpReq = null;
        if (request instanceof HttpServletRequest) {
            httpReq = (HttpServletRequest) request;
        }
        //请求相对路径
        String url = httpReq.getRequestURI();
        if(BlackUrl.size()>0)
        {
            for(String one:BlackUrl)
            {
                if(url.contains(one))
                {
                    //拉黑
                    if(!BlackMap.containsKey(ip)) {
                        BlackMap.put(ip, System.currentTimeMillis());
                    }
                }
            }
        }
        //被来黑的处理
        if (BlackMap.containsKey(ip) && httpReq != null) {
            long starBlackTime = BlackMap.get(ip);
            long timeCha = (System.currentTimeMillis() - starBlackTime)/1000;
            // 使用当前时间的毫秒数作为Random的种子
            Random random = new Random((int) (System.currentTimeMillis() % Integer.MAX_VALUE));
            // 生成一个介于0(包括)和60(不包括)之间的随机整数
            int randomInt = random.nextInt(60);
            //20秒之后再开始拉黑,20-90秒之间随机不响应(随着时间和随机数推移20-90秒之前先大部分失败然后失败量减少,然后再失败增加到全失败)
            if ((timeCha > 20) && (timeCha + randomInt) > 90) {
                //判断内外网IP
                boolean isInnerIP = JRT.Core.Util.IPMacUtil.IsInnerIP(ip);
                //分钟
                long miniteCha = timeCha / 60;
                if (isInnerIP && miniteCha > (60 * 24)) {
                    BlackMap.remove(ip);
                } else if ((!isInnerIP) && miniteCha > 5) {
                    BlackMap.remove(ip);
                } else {
                    httpReq = (HttpServletRequest) request;
                    //定向到警告页面
                    if (httpReq.getRequestURI().contains("/error/SecurityWarning.html")) {
                        chain.doFilter(request, response);
                    } else {
                        HttpServletResponse httpResp = null;
                        if (response instanceof HttpServletResponse) {
                            httpResp = (HttpServletResponse) response;
                        }
                        httpResp.sendRedirect("../../error/SecurityWarning.html");
                    }
                    return;
                }

            }
        }
        chain.doFilter(request, response);
    }


    /**
     * 销毁方法
     */
    public void destroy() {
    }
}


把实现的Filter类配置到web.xml
在这里插入图片描述

实现警告页面
在这里插入图片描述

效果,被拉黑的IP所有资源请求都定位到警告页面,爬虫行为的识别由业务自己判断
在这里插入图片描述
这样就能对恶意访问进行拦截

相关推荐

  1. 如何爬虫

    2024-04-20 17:40:04       33 阅读
  2. 爬虫】User-Agent爬虫

    2024-04-20 17:40:04       44 阅读
  3. kalman-filter python实现

    2024-04-20 17:40:04       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 17:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 17:40:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 17:40:04       82 阅读
  4. Python语言-面向对象

    2024-04-20 17:40:04       91 阅读

热门阅读

  1. http 3.0 QUIC 方案的原理解析

    2024-04-20 17:40:04       32 阅读
  2. 2024系统架构师---论软件系统架构风格

    2024-04-20 17:40:04       34 阅读
  3. SharpDevelop插件系统代码阅读笔记

    2024-04-20 17:40:04       38 阅读
  4. 【Python- try 异常】

    2024-04-20 17:40:04       34 阅读
  5. 【MySQL】MySQL锁(三)元数据锁与间隙锁

    2024-04-20 17:40:04       25 阅读
  6. TCP机械臂测试

    2024-04-20 17:40:04       36 阅读
  7. 抖音视频评论自动回复与主动回复的实现

    2024-04-20 17:40:04       104 阅读
  8. go的实践

    2024-04-20 17:40:04       32 阅读
  9. Multiprocessing Event Object In Python

    2024-04-20 17:40:04       32 阅读
  10. golang 连接oracle 11g数据库

    2024-04-20 17:40:04       39 阅读
  11. 安卓手机APP开发__媒体开发部分__媒体源

    2024-04-20 17:40:04       41 阅读
  12. 蓝桥杯备考随手记: practise08

    2024-04-20 17:40:04       33 阅读
  13. 基于Python的招聘岗位数据分析系统的设计与实现

    2024-04-20 17:40:04       38 阅读