import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.CopyOnWriteArrayList;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

/**

* 防止恶意刷新接口, 控制在5秒内不能被刷新10次以上

* @author alex.liul

* @create 2017.11.08

* @version 1.0

*/

public class RequestLimitCache {

private static final ConcurrentHashMap> map = new ConcurrentHashMap>();

private static final long EXPIRE_TIME = 1000 * 5L;

private static final int MAX_REFRESH_COUNT = 10;

private static final RequestLimitCache cache = new RequestLimitCache();

private RequestLimitCache() {

Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(new ClearCacheRunnable(), 1000L, 500L, TimeUnit.MILLISECONDS);

}

public static RequestLimitCache getInstance() {

return cache;

}

// 增加指定key的访问次数

public void increment(String key) {

CopyOnWriteArrayList list = map.get(key);

if (list == null) {

map.put(key, new CopyOnWriteArrayList());

}

map.get(key).add(System.currentTimeMillis());

}

// 是否到达指定数量

public boolean isUpCount(String key) {

CopyOnWriteArrayList 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() {

try {

clear();

} catch (Exception e) {

e.printStackTrace();

}

}

private void clear() {

for (String key : map.keySet()) {

CopyOnWriteArrayList list = map.get(key);

for (Long date : list) {

if ((System.currentTimeMillis() - date) > RequestLimitCache.EXPIRE_TIME) {

list.remove(date);

}

}

}

}

}

}

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;

/**

* 防止恶意刷新网站 控制网站的所有网页在5秒内不能被刷新10次以上

*

* @author alex.liul

* @create 2013.3.21

* @version 1.0

*/

public class RefreshFilter implements Filter {

public void init(FilterConfig config) throws ServletException {

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse res = (HttpServletResponse) response;

String ip = req.getRemoteAddr(); //得到客户端IP地址

String requestURI = req.getRequestURI();//得到客户请求的uri

String cache_key=ip+requestURI;

Cache cache = Cache.getInstance();

if (cache.isUpCount(cache_key)) {

res.setContentType("text/html; charset=UTF-8");// 响应类型

res.sendRedirect(req.getContextPath() + "/error.html");

} else {

cache.increment(cache_key);

chain.doFilter(request, response);

}

}

public void destroy() {

}

// 缓存

private static class Cache {

private static final ConcurrentHashMap> map = new ConcurrentHashMap>();

private static final long EXPIRE_TIME = 1000 * 5L;

private static final long CLEAR_TIME = 500L;

private static final int MAX_REFRESH_COUNT = 10;

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 list = map.get(key);

if (list == null) {

map.put(key, new CopyOnWriteArrayList());

}

map.get(key).add(new Long(System.currentTimeMillis()));

}

// 是否到达指定数量

public boolean isUpCount(String key) {

CopyOnWriteArrayList 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 list = map.get(key);

for (Long date : list) {

if ((System.currentTimeMillis() - date) > Cache.EXPIRE_TIME) {

list.remove(date);

}

}

}

}

}

}

}

java 防止恶意刷新_防止恶意刷新接口, 控制在5秒内不能被刷新10次以上相关推荐

  1. 什么方式可以通过影子系统传播恶意代码_将恶意代码隐藏在图像中:揭秘恶意软件使用的隐写术...

    概述 本周,许多Facebook用户都会发现,一些用户发布图片上出现了原本应该隐藏的图像标签.由此可以证明,图像可以携带大量表面上不可见的数据.实际上,Facebook和Instagram所使用的图片 ...

  2. java 大量数据返回_怎么接收第三方接口返回的大量数据?

    调用第三方接口时,由于返回的数据量过大,在获取并转换数据时报错,大家有什么好的解决办法? 报错代码: String resStr = EntityUtils.toString(response.get ...

  3. java 线程池超时_线程池中如何控制超时时间?

    线程池构造方法不能控制任务的超时时间, java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java. ...

  4. java console不见了_解决eclipse中console控制选项不见了的方法

    eclipse是一款用于编译java语言的程序,利用这款软件我们可以制作很多有趣的小程序,也可以制作一些大型的软件项目.在实际的操作中,eclipse是由多个工具栏组成的,其中console就是用于查 ...

  5. 精通java的拼写段子_[慎入]已经笑晕!只有程序员才懂的10个段子-Go语言中文社区...

    (1)有两个程序员:一个技术很牛.BUG很少,另一个技术很菜,BUG很多.那个很菜的程序员,经常被测试妹子叫去,接受批评教育. 后来,很菜的程序员跟测试的妹子擦出了火花,走到了一起. 技术很牛的程序员 ...

  6. java 微信高级群发_微信高级群发接口demo

    微信群发接口的基本思路: 1.  获取关注者列表 2.  创建群发的XML 3.  发送群发的XML. 作者编写了一个文本群发的demo 供读者分享. public class TestWeixinG ...

  7. java安全权限配置_使用Spring安全表达式控制系统功能访问权限问题

    一.SPEL表达式权限控制 从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限.Spring ...

  8. java弹力球程序_使用WindowsAPI编写在控制台中弹力球游戏小程序

    #include #include #include #include #include # define timer 10//毫秒单位,控制球的移速,与dx,dy也有关 char ch1[]={&q ...

  9. 利用浏览器指纹技术进行防恶意点击和恶意骚扰刷新系统

    本程序采用php语言自主开发,利用浏览器指纹技术进行防恶意点击和恶意刷新检测,抓取设备信息,准确无误! 自主开发完整设备信息追踪系统,用于控制关键词发包排名点击数据,防恶意访问,数据监控,用户行为检测 ...

最新文章

  1. springboot 和 mybatis整合:参数查询和动态sql
  2. [旧博客]不用编程也能搞定作弊刷票
  3. 半自动化运维之快速连接到指定环境(一)
  4. html引入html include_PostgreSQL引入插件EXTENSION的常用方法
  5. 新增磁盘,创建分区,分区挂载
  6. python实现梳排序
  7. 数据库范式那些事[转]
  8. 《概率论与数理统计》(浙大第四版)第五章总结笔记(纯手写)
  9. 【Udacity项目】TMDb电影数据集探索分析
  10. mysql5.6.39免安装,win7 64位配置mysql 5.6免安装版,初始化配置和Mysql创建新用户方
  11. Latex algorithm Input Output
  12. Access violation reading location 0x00000004.
  13. mysql还原报错[err]1153解决办法
  14. 安卓 蓝牙遥控器键值配对 kl文件
  15. -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp
  16. 基于ssm流浪猫狗|流浪狗宠物救助网站
  17. 实例分割向:Mask R-CNN
  18. 职场人士如何抵御消极心理暗示
  19. Cortex-M3/M4学习随笔——一些处理器基本信息
  20. English Grammar-奋斗的开始-简单句(二)

热门文章

  1. 蚂蚁笔记(leanote)搭建
  2. excel如何实现数据钻取
  3. 2016搜狗校招编程题
  4. 泛泰 A850 4.1.2 刷第三方专用Recovery合集
  5. Linux-CentOS 安装配置ExifTool
  6. 关于卫星定位,你想知道的一切
  7. C语言 | 函数参数
  8. python midi_Python | 读取 midi 文件
  9. matlab实用小程序段 —— 串口发送和读取
  10. Android内嵌H5,安卓手机返回键点击无反应、苹果手机返回键正常情况解决方案