import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RefreshFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
filter((HttpServletRequest) request,(HttpServletResponse) response, chain);
}
private void filter(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
String requestURI = request.getRequestURI();
Cache cache = Cache.getInstance();
cache.increment(requestURI);
if(cache.isUpCount(requestURI)) {
response.getWriter().println("到达次数,不允许请求,请稍候再试");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig config) throws ServletException {
}
//缓存
private static class Cache {
private static final ConcurrentHashMap<String, CopyOnWriteArrayList<Long>> map = new ConcurrentHashMap<String, CopyOnWriteArrayList<Long>>();
private static final long EXPIRE_TIME = 1000 * 20L;
private static final long CLEAR_TIME = 1000 * 2L;
private static final int MAX_REFRESH_COUNT = 20;
private static final Cache cache = new Cache();
private Cache() {
new Thread(new ClearCacheRunnable()).start();
}
public static Cache getInstance() {
return cache;
}
//增长指定URL的点击次数
public void increment(String key) {
CopyOnWriteArrayList<Long> list = map.get(key);
if(list == null) {
map.put(key, new CopyOnWriteArrayList<Long>());
}
map.get(key).add(new Long(System.currentTimeMillis()));
}
//是否到达指定数量
public boolean isUpCount(String key) {
CopyOnWriteArrayList<Long> list = map.get(key);
if(list == null) {
return false;
}
return list.size() > MAX_REFRESH_COUNT;
}
//清理过期数据线程
private static class ClearCacheRunnable implements Runnable {
@Override
public void run() {
while(true) {
try {
Thread.sleep(Cache.CLEAR_TIME);
clear();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void clear() {
for(String key : map.keySet()) {
CopyOnWriteArrayList<Long> list = map.get(key);
for(Long date : list) {
if(System.currentTimeMillis() - date > Cache.EXPIRE_TIME) {
System.out.println(list.remove(date));
}
}
}
}
}
}
}
相关推荐
js防止恶意刷新,这个函数纯粹是为了让标志稍微短点儿,一堆乱码还特有神秘感,另外,这个UserMd5函数是网上找来的现成儿的 ,屏蔽F5的刷新,屏蔽退格删除键,屏蔽 F5 刷新键,Ctrl + R
入侵检测,用filter实现,防止恶意刷新
这个讲述了两种使用软件方式进行阻止恶意刷新。提供了一些核心的代码,仅供参考。 提示:是收集技术网站上的资料整理的。
恶意刷新就是不停的去刷新提交页面,导致大量无效数据了,下面我们来总结一下php 防止恶意刷新页面方法总结
【检测恶意刷新的类】 * 恶意刷新定义:连续检测到‘短时刷新’次数超限。 * 恶意刷新的处理:一段时间不允许访问即check(keyStr)==false *有详细代码注释说明 *可设置访问间隔时间、恢复正常的访问间隔时间、短时...
资源相关博客:https://blog.csdn.net/u013938578/article/details/128717396
前段时间由于被过度访问,致使IIS崩溃,所以自己写了个asp.net网站页面防刷新的代码,分 Cookies版和Session版供大家分享
本文实例讲述了php防止恶意刷新与刷票的方法。分享给大家供大家参考。具体实现方法如下: 一般来说,恶意刷新就是不停的去刷新提交页面,导致出现大量无效数据,下面我们来总结一下php 防止恶意刷新页面方法总结。 ...
refresh filter is base class ,提供了一些核心的代码,仅供参考。
防止用户恶意刷新页面,过度频繁抓取网页。 采用动态判断,一定频率后转到提示页面,持续一段时间后放出来。
关于团购网站倒计时js,能有效防止恶意刷新
主要介绍了asp.net网站防恶意刷新的Cookies与Session解决方法,分别以实例的形式讲述了采用cookie法与session法实现WEB页面防止恶意刷新的技巧,需要的朋友可以参考下
//防刷新时间 $ip = get_client_ip(); $allowT = md5($ip.$k.$t); if(!isset($_SESSION[$allowT])) { $refresh = true; $_SESSION[$allowT] = time(); }elseif(time() – $_SESSION[$allowT]>$allowTime){ $refresh ...
主要介绍了php防止CC攻击代码和php防止网页频繁刷新,网页快速恶意刷新,cc攻击利用代理服务器生成指向目标站点的合法请求,模拟多用户不停的对受害网站进行访问,感兴趣的小伙伴们可以研究一下
为大家提供了php防止网站被攻击的应急代码,这是一个办法,绝对不是最好的解决方式,只是想提供给大家,大家一起探讨探讨。
通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx.
在开发“发送短信验证”功能时候,要解决一个问题,防止恶意或频繁发送短信验证码问题。一般原理是“当点击发送按钮时,发送ajax请求到服务器发送短信验证码,成功则把发送按钮设置为不可点击,并且调用定时器,按钮...
增加了HTML过滤,防止恶意提交。 4.增加空格和回车显示功能。 5.修改提交跳转防止刷新重复提交。 6.增加表情功能。 7.增加UBB代码,插入图片(系统固定变形200*200) / 红色加粗字体。 8.增加表单字数限制功能。 9....