重复请求是指在万维网中,浏览器或万维网客户向服务器发送一个请求,如果在短时间得不到回应,就会再一次发送请求或者浏览器或万维网客户短时间发送多次请求。重复请求是应用程序中一个常见的问题,重复请求发生的原因有多种多样,如网络较差,服务器端忙等。
中文名
重复请求
外文名
Repeat Request
1
简介2
原因
3
例子
4
计算机,互联网
重复请求简介
编辑
语音
重复请求是指在万维网中,浏览器或万维网客户向服务器发送一个请求,如果在短时间得不到回应,就会再一次发送请求或者浏览器或万维网客户短时间发送多次请求。重复请求是应用程序中一个常见的问题,重复请求是应用程序中一个常见的问题,重复请求发生的原因有多种多样,如网络较差,服务器端忙等。
重复请求原因
编辑
语音
发生重复请求的原因如下:
1)在应用层中,HTTP协议定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向事务应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。[1]
HTPP协议是无状态,同一个客户第二次访问同一个页面时,服务器反应与第一次请求相同,这也是重复请求发生的重要原因之一,尽管较新的HTTP协议使用了持续链接,这个问题没有完全解决。
2)服务器端很忙,当一个服务器有很多客户都发送请求时,服务器就会很忙,为了等到响应,就需要不断重复请求。例如很多学生都在同一时间都在登录成绩查询系统,就需要不断重复请求。
3)当网络性能很差时,我们为了能更快得到响应,需要重复请求。
重复请求例子
编辑
语音
例如有一个java webservice实现的生成订单接口,遇到了重复下单的问题,客户端2次请求相差时间间隔小,几乎是同时到达,导致了重复下单的问题。webservice调用的客户端我们干预不了,而且用户较多,所以只能考虑在服务端做处理。下面是怎么解决重复请求。做法就是把这个方法里的那段代码加个同步块,同时把该数据的某一唯一性字段(如订单号)放入内存中,执行完之后从内存中移除,每次到这个代码段时先判断内存中有没有这个订单号,有的话就不执行,没有就执行下面的操作,代码如下。
if(ConRunningMap.containsItem(this.fillOrder.trim())) {//判断内存中是否有这个订单号
return null;
} else {
ConRunningMap.addItem(this.fillOrder.trim());//订单号放到内存中
执行代码……
最后把订单号从内存中移除
ConRunningMap.removeItem(this.fillOrder.trim());
}
ConRunningMap 类:
public class ConRunningMap {
private static Map runningMap ;
public static Map powerInvoiceMap ;
public static Map getPowerInvoiceMap() {
return powerInvoiceMap;
}
public static voidsetPowerInvoiceMap(Map powerInvoiceMap) {
ConRunningMap.powerInvoiceMap =powerInvoiceMap;
}
public static synchronized void addItem(Stringitem) {
if(!item.equals("")){
runningMap.put(item,"");
}
}
public static synchronized void removeItem(String item) {
if(!item.equals("")){
runningMap.remove(item);
}
}
public static synchronized booleancontainsItem(String item) {
if(!item.equals("")&&runningMap.containsKey(item)){
return true;
}
return false;
}
public static void init() {
runningMap = new HashMap();
powerInvoiceMap = CPower.invoiceCodeMap();
}
}
参考资料
1.
谢希仁.计算机网络.北京:电子工业出版社,2012