`

防止网站恶意刷新

    博客分类:
  • java
 
阅读更多

 

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));
}
}
}
}
}
}


}
分享到:
评论

相关推荐

    防止恶意刷新

    因此,实现有效的防止恶意刷新机制对于保护网站安全至关重要。 #### 二、技术原理概述 根据提供的文件内容,我们可以看到一种综合客户端JavaScript和服务器端.NET技术的方法来实现防止恶意刷新的功能。这种方法...

    防止恶意刷新页面的java实现

    总结起来,防止恶意刷新页面的Java实现主要包括时间间隔限制和基于令牌的验证策略。这两种方法都可以有效地减少无效或恶意的请求,保护服务器资源,提高系统的稳定性和安全性。在实际开发中,可以根据应用场景和需求...

    springboot基于redis防止接口恶意刷新和暴力请求

    本篇文章将深入探讨如何利用Spring Boot和Redis来防止接口的恶意刷新和暴力请求。 首先,我们需要理解什么是接口恶意刷新和暴力请求。恶意刷新通常指短时间内对同一个接口进行大量的重复调用,这可能是为了执行恶意...

    入侵检测,防止恶意刷新

    入侵检测,用filter实现,防止恶意刷新

    java防恶意刷新的源码

    在Java Web开发中,防止恶意刷新是一项重要的任务,它能够保护服务器资源,避免因为用户频繁点击按钮导致的无用请求,影响系统性能和用户体验。"java防恶意刷新的源码"是一个关注点,通常通过实现过滤器(Filter)来...

    防止页面刷新重复提交的方法.

    Token 方法的优点是可以防止 CSRF(Cross-Site Request Forgery)攻击,CSRF 攻击是一种常见的 Web 攻击手法,攻击者可以欺骗用户提交恶意请求。 三、AJAX 方法 AJAX 方法是使用 JavaScript 和 XML 实现的异步请求...

    php中防止恶意刷新页面的代码小结

    首先,我们理解防止恶意刷新的基本原理:在用户访问页面时生成一个随机的验证字符串,通常称为“令牌”(Token),并将该令牌存储在用户的Session中。当用户提交表单时,服务器会检查提交的令牌是否与Session中的...

    检测恶意刷新的工具类

    【检测恶意刷新的类】 * 恶意刷新定义:连续检测到‘短时刷新’次数超限。 * 恶意刷新的处理:一段时间不允许访问即check(keyStr)==false *有详细代码注释说明 *可设置访问间隔时间、恢复正常的访问间隔时间、短时...

    php防恶意刷新,过度抓取页面脚本

    首先,我们需要理解恶意刷新和抓取的本质。恶意刷新通常是指用户短时间内连续点击页面按钮,导致服务器接收到大量的重复请求;过度抓取则常见于爬虫程序,它们会频繁地访问网站以获取大量数据。为应对这些问题,我们...

    asp.net 网站防刷新 Cookies版和Session版

    特别是在高并发场景下,如何有效地防止恶意刷新、保护服务器资源不受损害成为了一个重要的课题。本文将详细介绍一种用于ASP.NET网站的防刷新机制,并分别探讨基于Cookies和Session两种实现方式。 #### 一、背景介绍...

    springboot的框架下一些业务场景的实践代码(异步调用、ChartGPT的调用、策略模式、动态注入类、防止接口恶意刷新)

    springboot的框架下一些业务场景的实践代码,每个文件夹都是一个业务场景,文件夹中的readme.txt文件是对此场景的说明和使用(异步调用、ChartGPT的调用、策略模式、动态注入类、防止接口恶意刷新、forest包的Http...

    PHP 防恶意刷新实现代码

    最后,提供的链接提到的其他文章涉及到防止恶意刷新的更多方法,如使用令牌(token)机制防止CSRF攻击,过滤POST和GET数据以防止SQL注入,以及优化大量数据的数据库查询效率等。这些都是PHP开发中重要的安全和性能...

    asp.net网站防恶意刷新的Cookies与Session解决方法

    总的来说,通过在***网站中使用Cookies和Session来防止恶意刷新,是一种相对简单但有效的方法。它能够在不影响正常用户访问体验的同时,对频繁刷新行为进行一定的限制,保障服务器的资源不被恶意消耗。不过,需要...

    倒计时很实用的js,防止刷新

    关于团购网站倒计时js,能有效防止恶意刷新

    防止用户刷新,重复提交数据

    - **注册与登录**:防止恶意注册或频繁尝试登录。 - **评论发布**:确保评论只发布一次。 ### 五、优势与注意事项 使用Token机制的优势在于它提供了额外的安全层,避免了CSRF(跨站请求伪造)攻击。然而,需要注意...

    防止页面二次刷新

    在Web开发中,"防止页面二次刷新"是一个重要的议题,主要涉及到的是防止用户无意或恶意地多次提交表单数据,这种情况通常称为"二次提交"或"重复提交"。这一问题可能会导致数据库中的数据异常,影响系统的稳定性和...

    php防止恶意刷新与刷票的方法

    以下是一些防止恶意刷新和刷票的方法: 1. **使用验证码(CAPTCHA)**: 验证码是一种常用的技术,它要求用户在提交表单前输入图像上显示的一串随机字符。这可以防止自动化脚本或机器人无限制地刷新页面或提交表单...

    ASP图形防刷新计数器

    在Web开发中,计数器通常被用来记录网站页面的访问量或特定操作的次数,而“图形防刷新计数器”则是在这个基础上增加了一个防止用户恶意刷新的功能,以避免数据统计出现异常。 防刷新计数器的主要目的是防止用户...

    JSP防刷新计数器(cookie)

    在网页开发中,防止用户恶意刷新页面是一项重要的需求,因为它可能导致服务器资源的浪费,甚至影响到其他用户的体验。JSP(JavaServer Pages)提供了一种方法来实现这一功能,即利用Cookie来创建一个防刷新计数器。...

Global site tag (gtag.js) - Google Analytics