【任务13】数据统计与拦截:拦截恶意刷屏用户
本问题对应的项目链接:从0设计一个web项目
要求:
1、说一说你的大致处理逻辑
2、对于任何IP,在一分钟内访问超过 n 次,则拦截该IP,至于次数和时间范围,你们自己控制
3、进阶:支持白名单模式,就是IP在白名单里面的,则不受影响
本问题对应的项目链接:从0设计一个web项目
要求:
1、说一说你的大致处理逻辑
2、对于任何IP,在一分钟内访问超过 n 次,则拦截该IP,至于次数和时间范围,你们自己控制
3、进阶:支持白名单模式,就是IP在白名单里面的,则不受影响
共以下 5 个回答
redis用set存储白名单,用ip:访问ip存储访问次数一分钟过期。访问所有资源的时候都会被该拦截器拦截,首先检查该ip是否在白名单中,如果在直接放行,如果不在的话,查看该ip一分钟内访问次数,如果访问次数在100以内,则放行,反之不允许访问。
github地址:https://github.com/lei342345795/FromZerotoExpert
如何拦截恶意刷屏请求?
使用 注解 + aop 拦截器的方式,实现接口级别的防刷校验
对请求的唯一凭证(用户ID、token、sessionId都可以), 做请求数统计,存入redis,设置过期时间
本项目选择 hash(请求路径 + sessionId) 作为 redis 的 key,访问次数做 value
流程如下:
aop 的解决方案只有拦截器一种么?
不是的,一共有三种:
1. 过滤器 Filter:
– 属于 servlet 标准
– 需要配置匹配 url
– 只有一个方法
2. 拦截器 Interceptor:
– 属于 spring 对 servlet 实现的内容
– 需要配置匹配的 url
– 三个方法,比上面更细致,可以在不同时间点做拓展
3. aspectJ 切面:
– 属于 spring 对 aop 的实践方案
– 可以动态配置切点(aspectJ语法),比上面两者更加灵活
– 多个方法,最细致,可以在不同时间点做拓展
github 地址(点击即可)
对于白名单的处理,如果用redis缓存设置为永不过期,虽然查询速度快,但一个ip地址占4个字节,假设是大型网站,用户有1个亿吧,白名单存2000万,需要8000万字节,差不多76MB。对于现在8G的内存来说,可以接受,所以用redis存储,用redis的列表类型,另外可以提供几个接口动态维护白名单。拦截IP的话,当一个IP第一次请求时,创建一个IP+访问次数的键值对,过期数据设置为1分钟,当这个IP第二次请求时,直接将对应的访问次数加1,看它超过了10次没,超过了不容许访问,直到redis里对应的键值对过期,回到第一次访问的状态。这个逻辑可以封装成一个函数,在拦截器里面判断。访问次数和时间限制可以根据实际情况设置。
服务器链接:http://124.223.184.187:8088/FromZerotoExpert
Github仓库链接:https://github.com/jiangyklala/FromZerotoExpert/tree/dev
1.处理逻辑
在IP拦截器中进行拦截,获取访问者的IP,并在redis库中按如下顺序进行搜索:
①若此IP在白名单内,直接放行
②若此IP在黑名单内,不放行,并重定向至黑名单专享页面。
③若既不在白名单内,又不在黑名单内,则进行此IP的访问次数统计,其中在redis中的存储数据结构为String类型,key为cout:ip:+真实ip,值为访问次数,存活时间为1分钟。若访问时redis数据库中无此key,则在redis数据库中设置对应的key,并将值设为0。若访问时redis数据库中存在此key,则将访问次数加1(加1操作不会影响存活时间),若访问次数累计值超过100,则设置此ip为黑名单ip,并重定向至黑名单页面,加入黑名单的ip在访问所有资源时,都不可用。
注1:1分钟后,key会因为到了过期时间而失效,因此再次访问时会被重新归零。
注2:黑名单在redis存储的数据类型为String类型,key为black:ip:+真实ip,值为固定字符串。
注3:白名单应该在mysql中存储,并在服务器运行时动态加载到redis数据库中,因为自己IP个数有限,不好测试,就没继续开发此功能。
IP拦截器部分代码如下:
2.在这里设置的是1分钟内访问次数超过100次对IP进行拦截。因为测试时不容易模拟出1分钟超过100次的请求,所以在这里提供了一个按钮,点击就相当于用户访问次数过多直接被拦截。等待一分钟后即可正常操作。
gitHub地址:https://github.com/Second6s9/FromZerotoExpert/tree/dev
gitHub防覆盖地址:https://github.com/Second6s9/FromZerotoExpert/tree/day13
服务器地址:http://123.57.142.33:8088/FromZerotoExpert/