限制频繁刷新

通过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();
}

}
引用\[1\]:在Vue中实现下拉刷新的方法是通过使用一个自定义的组件wv-pull-refresh,并在父组件中调用该组件来实现下拉刷新的功能。在父组件的模板中,使用<wv-pull-refresh>标签包裹页面内容,并监听refresh事件来触发下拉刷新的操作。在父组件的方法中,可以通过调用done()方法将子组件的状态归零,表示下拉刷新完成。\[1\] 引用\[2\]:另一种实现下拉刷新的方法是通过引入工具类并调用其中的方法。在组件中引入工具类后,在created生命周期钩子函数中监听scroll事件,并在事件处理函数中使用函数节流的思路来限制方法的频繁调用。在滚动到底部后,调用工具类中的方法来执行相应的操作。在refresh方法中,同样可以通过调用done()方法将子组件的状态归零,表示下拉刷新完成。\[2\] 综上所述,可以通过使用自定义组件或引入工具类的方式来实现在Vue中不频繁下拉刷新的功能。具体的实现方式可以根据项目需求和个人偏好选择。 #### 引用[.reference_title] - *1* *2* *3* [vue实现上拉加载和下拉刷新](https://blog.csdn.net/qq_42527726/article/details/116043121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值