一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的反爬虫组件。
系统要求
- 基于 spring-boot 开发(spring-boot1.x, spring-boot2.x均可)
- 需要使用 redis
工作流程
kk-anti-reptile 使用基于 Servlet 规范的的 Filter 对请求进行过滤,在其内部通过 spring-boot 的扩展点机制,实例化一个 Filter,并注入到 Spring 容器 FilterRegistrationBean 中,通过 Spring 注入到 Servlet 容器中,从而实现对请求的过滤。
在 kk-anti-reptile 的过滤 Filter 内部,又通过责任链模式,将各种不同的过滤规则织入,并提供抽象接口,可由调用方进行规则扩展。
Filter 调用则链进行请求过滤,如过滤不通过,则拦截请求,返回状态码 509,并输出验证码输入页面,输出验证码正确后,调用过滤规则链对规则进行重置。(关注互联网架构师公众号回复“2T”,送你全套最新架构视频。)
目前规则链中有如下两个规则
ip-rule
ip-rule 通过时间窗口统计当前时间窗口内请求数,小于规定的最大请求数则可通过,否则不通过。时间窗口、最大请求数、ip 白名单等均可配置。
ua-rule
ua-rule 通过判断请求携带的 User-Agent,得到操作系统、设备信息、浏览器信息等,可配置各种维度对请求进行过滤。
命中规则后
命中爬虫和防盗刷规则后,会阻断请求,并生成接除阻断的验证码,验证码有多种组合方式,如果客户端可以正确输入验证码,则可以继续访问
验证码有中文、英文字母+数字、简单算术三种形式,每种形式又有静态图片和 GIF 动图两种图片格式,即目前共有如下六种,所有类型的验证码会随机出现,目前技术手段识别难度极高,可有效阻止防止爬虫大规模爬取数据。
接入使用
后端接入非常简单,只需要引用 kk-anti-reptile 的 maven 依赖,并配置启用 kk-anti-reptile 即可加入 maven 依赖
<dependency> <groupId>cn.keking.projectgroupId> <artifactId>kk-anti-reptileartifactId> <version>1.0.0-SNAPSHOTversion> dependency>
配置启用 kk-anti-reptile
anti.reptile.manager.enabled=true
前端需要在统一发送请求的 ajax 处加入拦截,拦截到请求返回状态码 509 后弹出一个新页面,并把响应内容转出到页面中,然后向页面中传入后端接口 baseUrl 参数即可,以使用 axios 请求为例:
import axios from 'axios'; import {baseUrl} from './config'; axios.interceptors.response.use( data => { return data; }, error => { if (error.response.status === 509) { let html = error.response.data; let verifyWindow = window.open("","_blank","height=400,width=560"); verifyWindow.document.write(html); verifyWindow.document.getElementById("baseUrl").value = baseUrl; } } ); export default axios;
注意
- apollo-client 需启用 bootstrap
使用 apollo 配置中心的用户,由于组件内部用到 @ConditionalOnProperty,要在 application.properties/bootstrap.properties 中加入如下样例配置,(apollo-client 需要 0.10.0 及以上版本)详见 apollo bootstrap 说明
apollo.bootstrap.enabled = true
- 需要有 Redisson
连接如果项目中有用到 Redisson,kk-anti-reptile 会自动获取 RedissonClient 实例对象; 如果没用到,需要在配置文件加入如下 Redisson 连接相关配置:
spring.redisson.address=redis://192.168.1.204:6379 spring.redisson.password=xxx
配置一览表
在 spring-boot 中,所有配置在配置文件都会有自动提示和说明,如下图:
所有配置都以 anti.reptile.manager 为前缀,如下为所有配置项及说明:
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-07-21
本文作者:互联网架构师
本文来自:“互联网架构师”,了解相关信息可以关注“互联网架构师”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
四种常见的系统架构,目前你处于哪个阶段呢?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 软件架构(software architecture)就是软件的基本结构。 合适的架构是软件成功的最重要因素之一。大型软件公司通常有专门的架构师职位(architect),只有资深程序员才可以担任。如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的4种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。 一、单体架构 单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Drango框架的应用。其架构图如下所示: 单体架构的应用比较容易部署、测试, 在项目的初期,单体应用可以很好地运行。然而,随着需求的不断增加, 越来越多的人加入开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。下面是单体架构应用的一些缺点: 复杂性高:以一个百万行级别的单体应用为例,整个项目包含的模块非...
- 下一篇
5G时代 运营商网络将面临何种挑战和机遇
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 至顶网网络与安全频道 07月20日 北京报道:随着国内5G的正式商用,到今天已经有一年多的时间了,期间伴随着互联网、移动化等产业趋势的不断深入发展,给传统服务提供商业务带来了全新的挑战和机遇。目前,服务提供商正处于业务转型的关键时期,而这种转型始发于市场对业务提出的新需求,最终将在服务提供商的基础设施建设与升级中得以体现。而云计算、大数据、人工智能等技术的引入正在为运营商应对5G市场所带来的种种挑战提供技术保障。 运营商网络面临的挑战 5G时代可以说给运营商网络带来了前所未有的冲击。随着5G的商业化落地,5G架构将连接亿级别的智能设备,网络流量增长会超过十倍之多,该架构需要展示强化的、更高程度的灵活性、敏捷性和自动化,这在很大程度上依赖网络功能虚拟化 (NFV) 和软件定义网络 (SDN) 基础架构,以便实现按需扩展和部署网络功能所需的弹性,支持各种全新的移动应用程序。 由于还要满足5G终端低延时、高并发等需求,5G网络采用了更加密集的微基站部署方式,而每个基站实际上就相当于一个小型或微...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音