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实现主要包括时间间隔限制和基于令牌的验证策略。这两种方法都可以有效地减少无效或恶意的请求,保护服务器资源,提高系统的稳定性和安全性。在实际开发中,可以根据应用场景和需求...
本篇文章将深入探讨如何利用Spring Boot和Redis来防止接口的恶意刷新和暴力请求。 首先,我们需要理解什么是接口恶意刷新和暴力请求。恶意刷新通常指短时间内对同一个接口进行大量的重复调用,这可能是为了执行恶意...
入侵检测,用filter实现,防止恶意刷新
在Java Web开发中,防止恶意刷新是一项重要的任务,它能够保护服务器资源,避免因为用户频繁点击按钮导致的无用请求,影响系统性能和用户体验。"java防恶意刷新的源码"是一个关注点,通常通过实现过滤器(Filter)来...
Token 方法的优点是可以防止 CSRF(Cross-Site Request Forgery)攻击,CSRF 攻击是一种常见的 Web 攻击手法,攻击者可以欺骗用户提交恶意请求。 三、AJAX 方法 AJAX 方法是使用 JavaScript 和 XML 实现的异步请求...
首先,我们理解防止恶意刷新的基本原理:在用户访问页面时生成一个随机的验证字符串,通常称为“令牌”(Token),并将该令牌存储在用户的Session中。当用户提交表单时,服务器会检查提交的令牌是否与Session中的...
【检测恶意刷新的类】 * 恶意刷新定义:连续检测到‘短时刷新’次数超限。 * 恶意刷新的处理:一段时间不允许访问即check(keyStr)==false *有详细代码注释说明 *可设置访问间隔时间、恢复正常的访问间隔时间、短时...
首先,我们需要理解恶意刷新和抓取的本质。恶意刷新通常是指用户短时间内连续点击页面按钮,导致服务器接收到大量的重复请求;过度抓取则常见于爬虫程序,它们会频繁地访问网站以获取大量数据。为应对这些问题,我们...
特别是在高并发场景下,如何有效地防止恶意刷新、保护服务器资源不受损害成为了一个重要的课题。本文将详细介绍一种用于ASP.NET网站的防刷新机制,并分别探讨基于Cookies和Session两种实现方式。 #### 一、背景介绍...
springboot的框架下一些业务场景的实践代码,每个文件夹都是一个业务场景,文件夹中的readme.txt文件是对此场景的说明和使用(异步调用、ChartGPT的调用、策略模式、动态注入类、防止接口恶意刷新、forest包的Http...
最后,提供的链接提到的其他文章涉及到防止恶意刷新的更多方法,如使用令牌(token)机制防止CSRF攻击,过滤POST和GET数据以防止SQL注入,以及优化大量数据的数据库查询效率等。这些都是PHP开发中重要的安全和性能...
总的来说,通过在***网站中使用Cookies和Session来防止恶意刷新,是一种相对简单但有效的方法。它能够在不影响正常用户访问体验的同时,对频繁刷新行为进行一定的限制,保障服务器的资源不被恶意消耗。不过,需要...
关于团购网站倒计时js,能有效防止恶意刷新
- **注册与登录**:防止恶意注册或频繁尝试登录。 - **评论发布**:确保评论只发布一次。 ### 五、优势与注意事项 使用Token机制的优势在于它提供了额外的安全层,避免了CSRF(跨站请求伪造)攻击。然而,需要注意...
在Web开发中,"防止页面二次刷新"是一个重要的议题,主要涉及到的是防止用户无意或恶意地多次提交表单数据,这种情况通常称为"二次提交"或"重复提交"。这一问题可能会导致数据库中的数据异常,影响系统的稳定性和...
以下是一些防止恶意刷新和刷票的方法: 1. **使用验证码(CAPTCHA)**: 验证码是一种常用的技术,它要求用户在提交表单前输入图像上显示的一串随机字符。这可以防止自动化脚本或机器人无限制地刷新页面或提交表单...
在Web开发中,计数器通常被用来记录网站页面的访问量或特定操作的次数,而“图形防刷新计数器”则是在这个基础上增加了一个防止用户恶意刷新的功能,以避免数据统计出现异常。 防刷新计数器的主要目的是防止用户...
在网页开发中,防止用户恶意刷新页面是一项重要的需求,因为它可能导致服务器资源的浪费,甚至影响到其他用户的体验。JSP(JavaServer Pages)提供了一种方法来实现这一功能,即利用Cookie来创建一个防刷新计数器。...