if (requestInfo.isTooOld()) {
requestInfo.reset();
chain.doFilter(request, response);
} else {
requestInfo.newRequest();
//如果请求太多就重定向到错误页面
if (requestInfo.isTooMuch()) {
System.out.println("Too much request from "+client);
((HttpServletResponse) response).sendRedirect("/toomuch.htm");
} else {
chain.doFilter(request, response);
}
}
} else {
requestInfo = new RequestInfo();
requestMap.put(client, requestInfo);
chain.doFilter(request, response);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
requestMap = new HashMap();
}
class RequestInfo {
long firstTime;
long lastTime;
int count;
public RequestInfo() {
firstTime = System.currentTimeMillis();
lastTime = System.currentTimeMillis();
count = 1;
}
public void reset() {
firstTime = System.currentTimeMillis();
lastTime = System.currentTimeMillis();
count = 1;
}
public void newRequest() {
lastTime = System.currentTimeMillis();
count++;
}
public boolean isTooMuch() {
int seconds=(int)((lastTime - firstTime) / 1000);
if (seconds==0) {
seconds=1;
}
int times = (int) (count /seconds );
if (times > MAX_TIMES_PER_SECOND) {
return true;
} else {
return false;
}
}
public boolean isTooOld() {
if (System.currentTimeMillis() - firstTime > MAX_TIME) {
return true;
} else {
return false;
}
}
}
}
使用这个方法的另外一个好处是对于防止的策略可以非常的灵活,允许多大强度的访问可以自己修改代码完全控制。
这个类还有一个问题是必须是在apache+tomcat这样的环境下,jsp转发给tomcat,而图片,js以及css什么的都是apache处理的,这样打开一个网页的时候对tomcat的请求数才不会太多而导致误判。
↑返回目录
前一篇: Ajax简单实例
后一篇: Tomcat+Mysql入门实例:滚动横幅广告