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 {//访问ipString 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) {//判断内外网IPboolean 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所有资源请求都定位到警告页面,爬虫行为的识别由业务自己判断
在这里插入图片描述
这样就能对恶意访问进行拦截

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625267.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爆肝3k字!掌握Spring与Redis的高效交互:从Jedis到Spring Data Redis

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

数字孪生技术的应用场景

数字孪生技术是一种新兴技术&#xff0c;具有广阔的应用前景。目前&#xff0c;数字孪生技术已经在以下几个领域得到了广泛应用。数字孪生技术是一种具有革命性的技术&#xff0c;它将深刻改变我们的生活和工作方式。随着数字孪生技术的不断发展&#xff0c;我们可以期待在未来…

Javascript中的this关键字指向,2024年最新阿里前端开发面试解答

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

【C++】适配器· 优先级队列 仿函数 反向迭代器

目录 适配器&#xff1a;适配器的应用&#xff1a;1. 优先级队列&#xff1a;仿函数&#xff1a;更深入的了解仿函数&#xff1a;一个关于不容易被注意的知识点&#xff1a; 2. 反向迭代器&#xff1a;&#xff08;list为例&#xff09; 适配器&#xff1a; 我们先来谈来一下容…

设计模式——2_9 模版方法(Template Method)

人们往往把任性也叫做自由&#xff0c;但是任性只是非理性的自由&#xff0c;人性的选择和自决都不是出于意志的理性&#xff0c;而是出于偶然的动机以及这种动机对感性外在世界的依赖 ——黑格尔 文章目录 定义图纸一个例子&#xff1a;从文件中获取信息分几步&#xff1f;Rea…

Adobe AE(After Effects)2017下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

MapReduce 机理

1.hadoop 平台进程 Namenode进程: 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个&#xff0c;分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log)&#xff…

vscode编译c++报错解决方案

1&#xff0c;xxxx cl.exe 一大串什么非程序员的(应该是这些&#xff09;,就是看一些谁的&#xff0c;调用了Visual Studio的编译软件去运行。建议&#xff0c;不要这样搞。 解决方案1&#xff1a;每次用就看这个文章&#xff08;个人觉得很麻烦&#xff09;&#xff1a;仅当…

java正则表达式教程

什么是正则表达式&#xff1a; 正则表达式是一种用来描述字符串模式的语法。在 Java 中&#xff0c;正则表达式通常是一个字符串&#xff0c;它由普通字符&#xff08;例如字母、数字、标点符号等&#xff09;和特殊字符&#xff08;称为元字符&#xff09;组成。这些特殊字符可…

NLP基础—jieba分词

jieba分词 支持四种分词模式 精确模式 试图将句子最精确地切开,适合文本分析;全模式 把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式 在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。paddle模式 利用Paddle…

WARNING: No swap limit support——查看docker状态时提示警告

环境&#xff1a;Ubuntu 20.04 1、警告详情 执行命令 service docker status如下图 2、解决办法 2.1 修改文件 执行命令 vim /etc/default/grub在GRUB_CMDLINE_LINUX中追加cgroup_enablememory swapaccount1&#xff0c;如下&#xff1a; # If you change this file…

elmentui树形表格使用Sortable拖拽展开行时拖拽bug

1、使用elemntui的el-table使用Sortable进行拖拽&#xff0c;如下 const el this.$el.querySelector(.el-table__body-wrapper tbody) Sortable.create(el, {onEnd: (event) > {const { oldIndex, newIndex } event//拿到更新前后的下标即可完成数据的更新} })2、但是我这…