2013-04-18 44 views
1

我有一個頁面,我正在使用jQuery ajax方法來調用一個簡單的Web服務,它將從數據庫獲取一些數據並將其綁定到頁面中的一些控件。 ajax方法在onchange事件中選擇(這裏的HTTP請求是POST)。以下是jQuery的AJAX方法處理jQuery提出的錯誤Ajax方法

function CallAjax(url, jsonData, SucessFunction, FailurFunction) { 
$.ajax({ 
    type: "POST", 
    url: url, 
    data: jsonData, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: SucessFunction, 
    error: function(){ 
     alert('error occured'); 
    } 
}); 

}

用於上述方法的URL是SomePage.aspx頁面/ getDataFromDatabse其中getDataFromDatabse是web服務的方法。我們的測試人員正在使用burp套件測試頁面。當他們直接綁定訪問瀏覽器中的url(www.example.com/somepage.aspx/getDataFromDatabse)時,burp套件中顯示的HTTP方法爲GET,並且會引發錯誤,並且用戶將被重定向到適當的頁面。但是,當它們被直接訪問上述URL和攔截在打嗝套件請求和改變GET請求到POST請求被直接顯示在瀏覽器下面的錯誤消息:

{「消息」:「發生錯誤處理請求「」堆棧跟蹤。「:」」,‘ExceptionType’:‘’}

的‘是沒有得到執行在上述AJAX功能誤差’,並且未示出的警告框,我們能夠來處理錯誤。如何處理這樣的錯誤並將用戶重定向到自定義頁面?

回答

1

看起來你的服務器的響應是一個有效的JSon響應,儘管它包含了什麼(你)讀取的錯誤。因此,$.ajax(...)調用將成功處理響應,而不是錯誤。

您可以返回一個有效的JSON響應和迴應中,指出是否有錯誤或不與任何其他信息一起,例如一個用戶友好的錯誤消息,重定向URL等

error:$.ajax(...)呼叫的處理程序應該用於真正服務器響應錯誤(即未處理的500錯誤,超時等)

例如,您成功的JSON響應可能是這樣的:

{ 
    success: true, 
    errorMessage: null, 
    errorRedirectUrl: null, 
    data: { .... your successful data response .... } 
} 

和您的失敗​​JSon響應(例如,由於驗證問題,而不是服務器故障)是這樣的:

{ 
    success: false, 
    errorMessage: 'There was an error processing the request.', 
    errorRedirectUrl: 'http://....someurl...', 
    data: null 
} 

然後你在$.ajax(....)通話success:選項,以檢查response.success == true,並適當地處理。

通過具有單一,一致的結構success:選項處理所有Ajax請求其完成,然後確定是否有一個處理錯誤,並用它做什麼,比如顯示一個警告用戶,他們重定向到一個URL,等...

相比之下,error:選項僅處理這不回來你可以使用響應的Ajax請求。

更新:

在您的服務器你已經處理接收GET HTTP請求和POST http請求的區別。所以,我認爲你的問題在於你還需要檢測POST請求是否包含webservice方法所需格式的有效數據。

因此,您的Web服務需要確定HTTP請求中的POST數據是否處於期望接收的格式,並且是否返回HTTP重定向響應(302)而不是返回錯誤。

你可以通過兩種方式做到這一點:

  1. 使用Try... Catch...塊。你的webservice方法已經顯示拋出一個異常並返回它,所以趕上它,然後而不是返回它,設置並返回302響應。

  2. 如果真正調用web服務可以產生在正常操作下的例外(這通常是不好的!),你需要驗證的請求,接收到的數據,看看它是什麼web服務方法期望接收(是接收到的數據是它的正確結構將由Ajax請求被髮送等等?)

注:如果請求確實包含有效數據,那麼有沒有簡單的方法來檢測是否該來自真正的來源(ajax調用)或通過其他方式僞造的請求。有解決方案,但它們涉及,可能需要多個電話進行身份驗證等。

+0

ajax方法只能在'select'(dropdownlist)html控件的'onchange' js事件上調用。但是當服務方法(www.example.com/somepage.aspx/getDataFromDatabse)的url直接在瀏覽器中輸入並訪問並且GET類型通過burp套件更改爲POST時,它會返回一個有效的JSON結果說,但沒有jquery ajax方法被調用來處理這個JSON結果,並且JSON結果直接由瀏覽器以純文本顯示。如何處理這個? – seadrag0n

+0

@ghouse - 如果我正確理解你,當你在URL中輸入瀏覽器(並將方法改爲POST)時,jquery'$ .ajax(...)'永遠不會被調用,所以它不會被調用聽取回應。也許我完全不瞭解你的問題? – Chris

+0

你是正確的,因爲jquery'$ .ajax(...)'只在'onchange'上被調用,當瀏覽器直接訪問'URL'時不會被調用,並且由於GET被改爲POST,直接在瀏覽器中以JSON格式顯示上述消息。 – seadrag0n