0 0

防止网站恶意刷新10

我现在有一个大型的网站,
请问我如何在这个网站的全局类或者模板类里加上代码可以控制该网站的所有网页在20秒内不能被刷新10次以上,最好是有点代码提示。谢谢各位大侠。

问题补充:
zhangkaitao 写道

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




你配置下测试一下,看是否满足你的需求

非常感谢!不管怎样先赞一个先
2010年4月06日 11:50

1个答案 按时间排序 按投票排序

0 0


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




你配置下测试一下,看是否满足你的需求

2010年4月06日 13:58

相关推荐

    防止恶意刷新

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

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

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

    入侵检测,防止恶意刷新

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

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

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

    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