修订版已经发布:请看完这篇文章后再去看修订版
前段时间弄爬虫的时候,在爬iteye的时候碰到过一个场景,Spider跑几次或者抓取的时间间隔小一点之后就会出现401错误
16-08-16 15:05:49,687 INFO us.codecraft.webmagic.Spider(Spider.java:307) ## Spider 843977358.iteye.com started!
16-08-16 15:05:49,696 INFO us.codecraft.webmagic.downloader.HttpClientDownloader(HttpClientDownloader.java:87) ## downloading page http://843977358.iteye.com/
16-08-16 15:05:50,056 WARN us.codecraft.webmagic.downloader.HttpClientDownloader(HttpClientDownloader.java:100) ## code error 401 http://843977358.iteye.com/
不用想,一定是人家后台给限制住了。
因此,自己就瞎鼓捣搞了一个简单点的,仅仅可以实现对用户IP次数的检查和对违规用户的封禁
用到的技术
过滤器(Filter):统计用户访问次数,记录访问时间、封禁时间
监听器(Listener):工程运行时初始化IP存储器(此处用的Map)
我的思路:
工程启动时,创建两个Map,一个(ipMap)用来存放用户Ip和访问时间等主要信息,另一个(limitedIpMap)用来存放被限制的用户IP。Map的key为用户的IP,value为具体内容。
当用户访问系统时,通过IPFilter检查limitedIpMap中是否存在当前IP,如果存在说明该IP之前存在过恶意刷新访问,已经被限制,跳转到异常提示页面;如果limitedIpMap
中不存在则检查ipMap中是否存在当前IP,如果ipMap中不存在则说明用户初次访问,用户访问次数+1,初始访问时间为当前时间;如果存在则检查用户访问次数是否在规定的短时间内进行了大量的访问操作;如果是,则将当前IP添加到limitedIpMap中,并跳转到异常提示页面,否则不进行操作,直接放行本次请求。
(简单画了下流程图,看不懂的就脑补吧,脑补吧,补吧,吧...)
配置文件:
IPFilter
com.test.interceptor.IPFilter
IPFilter
/render/*
com.test.listener.MyListener
监听器MyListener:
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;