複製鏈接
請複製以下鏈接發送給好友

重複請求

鎖定
重複請求是指在萬維網中,瀏覽器或萬維網客户向服務器發送一個請求,如果在短時間得不到迴應,就會再一次發送請求或者瀏覽器或萬維網客户短時間發送多次請求。重複請求是應用程序中一個常見的問題,重複請求發生的原因有多種多樣,如網絡較差,服務器端忙等。
中文名
重複請求
外文名
Repeat Request

目錄

重複請求簡介

重複請求是指在萬維網中,瀏覽器或萬維網客户向服務器發送一個請求,如果在短時間得不到迴應,就會再一次發送請求或者瀏覽器或萬維網客户短時間發送多次請求。重複請求是應用程序中一個常見的問題,重複請求是應用程序中一個常見的問題,重複請求發生的原因有多種多樣,如網絡較差,服務器端忙等。

重複請求原因

發生重複請求的原因如下:
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<String, String> runningMap ;
public static Map<String, String> powerInvoiceMap ;
public static Map<String, String> getPowerInvoiceMap() {
return powerInvoiceMap;
}
public static voidsetPowerInvoiceMap(Map<String, String> 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<String, String>();
powerInvoiceMap = CPower.invoiceCodeMap();
}
}
參考資料
  • 1.    謝希仁.計算機網絡.北京:電子工業出版社,2012