1

我有一个页面,我在其中使用 jQuery ajax 方法来调用一个简单的 Web 服务,该服务将从数据库中获取一些数据并将其绑定到页面中的一些控件。在 select 的onchange事件上调用 ajax 方法(这里的 HTTP 请求是 POST)。以下是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 并在 burp 套件中拦截请求并将 GET 请求更改为 POST 请求时,浏览器中会直接显示以下错误消息:

{"Message":"处理请求时出错。","StackTrace":"","ExceptionType":""}

上面的 ajax 函数中的“错误”没有被执行,并且没有显示警告框,我们能够处理错误。如何处理此类错误并将用户重定向到自定义页面?

4

1 回答 1

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
}

然后你检查调用response.success == truesuccess:选项$.ajax(....),并适当地处理。

通过具有单一、一致的结构,该success:选项处理所有已完成的 ajax 请求,然后确定是否存在已处理的错误以及如何处理它,例如向用户显示警报、将它们重定向到 URL 等...

相反,该error:选项仅处理那些没有返回您可以使用的响应的 ajax 请求。

更新:

GET在您的服务器上,您已经在处理接收http 请求和http 请求之间的区别POST。所以,我认为你的问题是你还需要检测POST请求是否包含webservice方法需要的格式的有效数据。

因此,您的 Web 服务需要确定 http 请求中的 POST 数据是否采用它期望接收的格式,如果不是,则返回 HTTP 重定向响应 (302) 而不是返回错误。

你可以通过两种方式做到这一点:

  1. 使用Try... Catch...块。您的 webservice 方法似乎已经抛出异常并返回它,因此捕获它然后不返回它,而是设置并返回 302 响应。

  2. 如果对 web 服务的真正调用可以在正常操作下产生异常(这通常很糟糕!),您需要验证请求中接收到的数据,以查看它是否是 web 服务方法期望接收的(是否接收到数据?是ajax 请求发送的正确结构?等)

注意:如果请求确实包含有效数据,那么就没有简单的方法来检测这些数据是来自真实来源(ajax 调用)还是来自其他方式的伪造请求。有解决方案,但它们涉及并且可能需要多次调用以进行身份​​验证等。

于 2013-04-18T14:53:49.957 回答