限制用户频繁

通过session限制用户频繁(限制了一定时间里最多能刷多少次--刷新频率)刷新某个页面:

Java代码
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的最大生命周期来判断刷新次数,不是什么好的办法

Java代码
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();
	}
	
}

 

posted @ 2016-06-01 10:08  猛龙飞天  阅读(104)  评论(0)    收藏  举报