`

限制频繁刷新

    博客分类:
  • java
阅读更多
通过session限制用户频繁(限制了一定时间里最多能刷多少次--刷新频率)刷新某个页面:
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 调用方式:在页面中直接调用下面代码
	StopRefresh stopRefresh = new StopRefresh();
	stopRefresh.limitTime =4;//可以不设置,默认10秒
	stopRefresh.refreshCount=2;//可以不设置,默认5次
	stopRefresh.redirectPage="/index.jsp";////可以不设置,/index.jsp
	stopRefresh.blackPage="/index.jsp";////可以不设置,/index.jsp
	stopRefresh.blackList = "192.168.61.110,2009-08-03 10:00:00,20;";//后面一定要有分号
	if(stopRefresh.stopRefreshPage(request,response)){
		return;
	}

 * @author Administrator
 *
 */
public class StopRefresh {
	
	//刷新的时间段,单位:秒
	public int limitTime = 10;

	//刷新的时间段的最大刷新次数
	public int refreshCount=5;
	
	//超过刷新次数后跳转的页面
	public String redirectPage = "/include/functionremind.htm";
	
	//192.168.61.110,yyyy-MM-dd HH:mm:ss,10;192.168.61.111,yyyy-MM-dd HH:mm:ss,100(IP,具体开始时间,禁用时间)
	public String blackList = "";
	
	public String blackPage = "/include/functionremind.htm";
	
	public static final SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	/**
	 * 阻止频繁刷新同一页面
	 */
	@SuppressWarnings("unchecked")
	public boolean stopRefreshPage(HttpServletRequest request,HttpServletResponse response) throws IOException{
		
		//判断是否超出次数或黑名单
		boolean isOverTime = false;
		
		//PrintWriter out = response.getWriter();
		String htmlContent="<script type=\"text/javascript\">window.location.href='"+redirectPage+"'</script>";
		
		String curPath = request.getServletPath();//当前路径
		int latestRefreshNum = 0;//最后一次保存的刷新
		
		TreeMap<Date,Integer> stopRefreshMap = null;
		HttpSession session = request.getSession();
		
		if(null != session.getAttribute("stopRefreshMap"+curPath)){
			stopRefreshMap = (TreeMap<Date,Integer>)session.getAttribute("stopRefreshMap"+curPath);
			
			if(stopRefreshMap.size()!=0){
				Date latestDate = stopRefreshMap.lastKey();//上一次刷新的次数
				latestRefreshNum = stopRefreshMap.get(latestDate)+1;//次数加1
				
				Date newDate = new Date();
				//out.println(newDate);
				stopRefreshMap.put(newDate, latestRefreshNum);
				
				//最新刷新时间的前10秒的时间
				Date tempDate = new Date(newDate.getTime() - limitTime*1000L);
				
				//删除不需要的对象(超过limitTime秒前的对象)
				Iterator<Date> iterator = stopRefreshMap.keySet().iterator();
				while(iterator.hasNext()){
					Date date = iterator.next();			
					if((tempDate.compareTo(date))>0){
						iterator.remove();//这行代码是关键,不然在对一个map进行迭代遍历并删除一些符合条件的键值对的时候,容易出现java.util.ConcurrentModificationException 这个异常。
						stopRefreshMap.remove(date);
					}
				}
					
				session.setAttribute("stopRefreshMap"+curPath, stopRefreshMap);
				
				int countNum = stopRefreshMap.get(stopRefreshMap.lastKey()) - stopRefreshMap.get(stopRefreshMap.firstKey());
				//out.println(countNum);
				//判断refreshCount秒内刷新的次数是否超出了指定的次数
				if(countNum >= refreshCount){
					isOverTime = true;
				}
				
				boolean isBlackList = false;
				try{
					if(blackList.trim().length()>0){
						String blackIP = request.getRemoteAddr();
						int position = blackList.indexOf(blackIP);
						if(position != -1){//是否在黑名单中
							Date date = dateFormat.parse(blackList.substring(position+blackIP.length()+1, position+blackIP.length()+21));
							Date newDate2 = new Date(); 
							if(newDate2.getTime()<(date.getTime()+Long.parseLong(blackList.substring(position+blackIP.length()+21, blackList.indexOf(";",position)))*60*1000)){
								isOverTime = true;
								isBlackList = true;
							}
						}					
					}
				}catch (Exception e) {
					e.printStackTrace();
				}
				
				if(isOverTime){
					PrintWriter out = response.getWriter();
					if(isBlackList){
						out.println("<script type=\"text/javascript\">window.location.href='"+blackPage+"'</script>");
					}else{
						out.println(htmlContent);
					}
					out.flush();
					out.close();
					
				}
			}
			
		}else{
			stopRefreshMap = new TreeMap<Date, Integer>();
			stopRefreshMap.put(new Date(), 1);
			session.setAttribute("stopRefreshMap"+curPath, stopRefreshMap);
			
		}
		
		return isOverTime;
	}
	

	public static void main(String args[]) {
		boolean isBlackList = false;
		String blackList = "192.168.158.90,2009-08-04 16:06:00,120;";
		try {
			if (blackList.trim().length() > 0) {
				String blackIP = "192.168.158.90";
				int position = blackList.indexOf(blackIP);
				System.out.println(position);
				if (position != -1) {
					Date date = dateFormat.parse(blackList.substring(position+blackIP.length()+1, position+blackIP.length()+21));
					Date newDate2 = new Date(); 
					if(newDate2.getTime()<(date.getTime()+Long.parseLong(blackList.substring(position+blackIP.length()+21, blackList.indexOf(";",position)))*60*1000)){
						System.out.println("blackIP:" + blackIP);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


下面的利用Cookie来限制刷新频率,这个是利用了Cookie的最大生命周期来判断刷新次数,不是什么好的办法

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 调用方式:在页面中直接调用下面代码
	StopRefresh stopRefresh = new StopRefresh();
	stopRefresh.limitTime =4;//可以不设置,默认10秒
	stopRefresh.refreshCount=2;//可以不设置,默认5次
	stopRefresh.redirectPage="/index.jsp";////可以不设置,/index.jsp
	stopRefresh.cookieStopRefresh(request,response);

 * @author Administrator
 *
 */
public class StopRefresh {
	
	//刷新的时间段,单位:秒
	public int limitTime = 10;

	//刷新的时间段的最大刷新次数
	public int refreshCount=5;
	
	//超过刷新次数后跳转的页面
	public String redirectPage = "/index.jsp";
/**
	 * 利用Cookie阻止频繁刷新同一页面
	 */
	public void cookieStopRefresh(HttpServletRequest request,HttpServletResponse response) throws IOException{
		PrintWriter out = response.getWriter();
		
		//页面内容
		String htmlContent="<script type=\"text/javascript\">window.location.href='"+redirectPage+"'</script>";
		
		String cookiePath = request.getServletPath();
		Cookie myCookie = null;
		Cookie[] cookies = request.getCookies(); 
		
		//如果cookies为null则创建一个
		if(null == cookies){
			myCookie = new Cookie(cookiePath, "1"); 
			response.addCookie(myCookie);
		}else{
			//取出需要的cookie
			for(int i=0;i<cookies.length;i++){
				if(cookies[i].getName().equalsIgnoreCase(cookiePath)){
					myCookie = cookies[i];
				}
			}
			
			//如果myCookie为null则创建,同时设置cookie的最大生命时长
			if(null == myCookie){
				myCookie = new Cookie(cookiePath, "1"); 
				myCookie.setMaxAge(limitTime);
				response.addCookie(myCookie);
			}else{
				//每刷新一次都设置一次cookie的最大生命时长
				myCookie.setMaxAge(limitTime);
				
				//如果cookieTime内刷新次数大于最大能刷新次数则跳转页面(防止不断刷新),反之刷新次数对应的加1
				if(Integer.parseInt(myCookie.getValue())>=refreshCount){
					out.println(htmlContent);
				}else{
					int count = 1;
					String cookieValue = myCookie.getValue();
					if("".equals(cookieValue)){
						myCookie.setValue(count+"");
						response.addCookie(myCookie);
					}else{
						count = Integer.parseInt(myCookie.getValue())+1;
						myCookie.setValue(count+"");
						response.addCookie(myCookie);
					}
					//out.println(myCookie.getValue());
				}
				//out.println(myCookie.getName());
			}
		}
		out.flush();
		out.close();
	}
	
}




分享到:
评论

相关推荐

    java控制页面刷新频率

    java控制页面刷新频率,代码、注释、实例

    PyQt6限制按钮点击次数 按钮点击三次后禁用

    # PyQt6限制按钮点击次数 按钮点击三次后禁用 1. 创建 QPushButton 按钮,并绑定自定义函数作为按钮点击事件; 2. 新建整数型变量用于存储按钮点击次数; 3. 在按钮点击函数中定义每次点击变量加一,并判断等于3时将...

    全码 WDB 论坛

    各版块更新数据单独存放,防止频繁读写增加崩溃可能 .投票支持 3D 饼图 和条形图 .独特上一贴和下一贴,顺序按直观方式,而且附有主题说明 .方便的 群发邮件 功能,可以使用 $username,$password,$email...

    Wdb论坛非常高速特别版php

    各版块更新数据单独存放,防止频繁读写增加崩溃可能 .投票支持 3D 饼图 和条形图 .独特上一贴和下一贴,顺序按直观方式,而且附有主题说明 .方便的 群发邮件 功能,可以使用 $username,$password,$...

    phobia-blur:Chrome扩展程序可隐藏您在上网时不想看到的文字和图像

    恐惧症 Chrome扩展程序可以模糊掉您不想在Internet上看到的文字和图像。 例如,在网上冲浪时,关于gop-i,bar-beol-beol的文字和图像可能会引起您的烦恼,而这些文本和图像会在没有... 在动态元素添加频繁发生的网站

    网站计数器(源码ASP)

    3.页面显示记数和IP防刷新记数两种记数模式,支持Script方式和Img方式调用计数器代码。 4.可以记录来访客的来源IP地址和来源页面信息,在线人数。 5.每月、每天和每小时的访问数据统计,回头率统计,每个网页浏览统计...

    wdb易风改进版

    -- 各版块更新数据单独存放,防止频繁读写增加崩溃可能 -- 投票支持3D饼图和条形图 -- 独特上一贴和下一贴跳转,顺序按直观方式,而且附有主题说明 -- 方便的群发邮件功能,可以使用$username,$...

    塞普森信息管理系统2008奥运旗舰版

    数据存储:数据信息自动生成XML文件进行存储、万条信息数据,数据库不会超过10M,让系统不频繁访问数据库,大大减轻数据库服务器的压力; 自定义属性:所有自定义属性支持各个页面调用; 后台功能:1、...

    客户端统一验证JavaScript函数库及示例源码

    Web应用如此广泛,其中客户端与服务端交互时所消耗的资源及响应时间,频繁的刷新页面使得人机交互体验极为不好,而对每个页面使用客户端处理技术无疑又加大项目开发周期,脚本调试及修改维护的工作量将占用大量的...

    e语言-鱼刺多线程例程 [v4.7]代理智能提取

    : 提取代理时附加的HTTP协议头 默认=空(默认协议头)提取间隔 : 两次提取最小间隔(毫秒) 为了防止提取API接口限制提取频繁冻结 默认=1000(1秒)----------------验证地址 : 用于验证代理是否有效的url 比如IP...

    文章管理系统

    8.纠正最新消息更多列表没加入最新消息文章属性限制 9.后台评论管理中,文章链接地址改用伪静态路径 10.去掉后台参数设置中,[后台头部界面]和[用户管理菜单]项 11.解决后台编辑器之前空2格低于一个汉字的问题 12....

    易想最新升级包V4.0

    7.网站增加cookie验证管理,可以设置使用session还是cookie进行验证(主要针对用户总是频繁退出的问题); 8.修复相关搜索功能、广告管理功能、及其它功能的修复,更新产品报价查询页面功能 ; 9.新增整合论坛:动网V8.0...

    mysql数据库my.cnf配置文件

    # innodb主线程刷新缓存池中的数据,使脏数据比例小于90% innodb_lock_wait_timeout = 120 # InnoDB事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。...

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    手机 pdf 阅读器

    触摸屏用户可以不再受滚动条限制,在屏幕上任意地方都可以进行拖动 选择键盘映射为其它时无法再次更改的BUG 用户输入的颜色值无法保存的BUG 修正英文单词分词时会多添加一个空行的BUG 繁体语言措词上的修正 阅读设置...

    正式版的VeryCMS管理系统程序 v3.0gbk,utf8,big5

    19,新版CMS以栏目为中心,不同的栏目可以使用不同的内容模型,也可以读取BBS/Blog信息,栏目纵深允许无限延伸,从此不再受只能创建二级子栏目的限制。 20,新增强大的采集功能。所需要采集的字段可自定义,所有的内容...

    Nslove速递交友系统 v5.0

    语言环境ASP+SQL存储过程,支持达百万会员,结合Ajax无刷新设计,提高用户的使用体验。布局方式Div+CSS设计提高访问速度!各栏目可生成静态html。  2、后台提供会员资料采集,可采集世纪佳缘、嫁我网会员等,如需要...

    CISCO路由之排除路由故障

    LSA刷新过程  8.SPF计算和路由翻动  只要拓扑有变化,OSPF就运行SPF算法再次计算最短路径优先树。,可能引起链路的不稳定。  原因:。 区域内的接口翻动  。 区域内的邻居接口翻动  。 重复的路由器ID ...

Global site tag (gtag.js) - Google Analytics