java 防止恶意刷新_防止恶意刷新接口, 控制在5秒内不能被刷新10次以上
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次以上相关推荐
- 什么方式可以通过影子系统传播恶意代码_将恶意代码隐藏在图像中:揭秘恶意软件使用的隐写术...
概述 本周,许多Facebook用户都会发现,一些用户发布图片上出现了原本应该隐藏的图像标签.由此可以证明,图像可以携带大量表面上不可见的数据.实际上,Facebook和Instagram所使用的图片 ...
- java 大量数据返回_怎么接收第三方接口返回的大量数据?
调用第三方接口时,由于返回的数据量过大,在获取并转换数据时报错,大家有什么好的解决办法? 报错代码: String resStr = EntityUtils.toString(response.get ...
- java 线程池超时_线程池中如何控制超时时间?
线程池构造方法不能控制任务的超时时间, java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java. ...
- java console不见了_解决eclipse中console控制选项不见了的方法
eclipse是一款用于编译java语言的程序,利用这款软件我们可以制作很多有趣的小程序,也可以制作一些大型的软件项目.在实际的操作中,eclipse是由多个工具栏组成的,其中console就是用于查 ...
- 精通java的拼写段子_[慎入]已经笑晕!只有程序员才懂的10个段子-Go语言中文社区...
(1)有两个程序员:一个技术很牛.BUG很少,另一个技术很菜,BUG很多.那个很菜的程序员,经常被测试妹子叫去,接受批评教育. 后来,很菜的程序员跟测试的妹子擦出了火花,走到了一起. 技术很牛的程序员 ...
- java 微信高级群发_微信高级群发接口demo
微信群发接口的基本思路: 1. 获取关注者列表 2. 创建群发的XML 3. 发送群发的XML. 作者编写了一个文本群发的demo 供读者分享. public class TestWeixinG ...
- java安全权限配置_使用Spring安全表达式控制系统功能访问权限问题
一.SPEL表达式权限控制 从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限.Spring ...
- java弹力球程序_使用WindowsAPI编写在控制台中弹力球游戏小程序
#include #include #include #include #include # define timer 10//毫秒单位,控制球的移速,与dx,dy也有关 char ch1[]={&q ...
- 利用浏览器指纹技术进行防恶意点击和恶意骚扰刷新系统
本程序采用php语言自主开发,利用浏览器指纹技术进行防恶意点击和恶意刷新检测,抓取设备信息,准确无误! 自主开发完整设备信息追踪系统,用于控制关键词发包排名点击数据,防恶意访问,数据监控,用户行为检测 ...
最新文章
- springboot 和 mybatis整合:参数查询和动态sql
- [旧博客]不用编程也能搞定作弊刷票
- 半自动化运维之快速连接到指定环境(一)
- html引入html include_PostgreSQL引入插件EXTENSION的常用方法
- 新增磁盘,创建分区,分区挂载
- python实现梳排序
- 数据库范式那些事[转]
- 《概率论与数理统计》(浙大第四版)第五章总结笔记(纯手写)
- 【Udacity项目】TMDb电影数据集探索分析
- mysql5.6.39免安装,win7 64位配置mysql 5.6免安装版,初始化配置和Mysql创建新用户方
- Latex algorithm Input Output
- Access violation reading location 0x00000004.
- mysql还原报错[err]1153解决办法
- 安卓 蓝牙遥控器键值配对 kl文件
- -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp
- 基于ssm流浪猫狗|流浪狗宠物救助网站
- 实例分割向:Mask R-CNN
- 职场人士如何抵御消极心理暗示
- Cortex-M3/M4学习随笔——一些处理器基本信息
- English Grammar-奋斗的开始-简单句(二)