【问题标题】:Handling errors raised by jQuery Ajax method处理 jQuery Ajax 方法引发的错误
【发布时间】:2013-04-18 14:33:52
【问题描述】:

我有一个页面,我在其中使用 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 Suite 中拦截请求并将 GET 请求更改为 POST 请求时,浏览器中会直接显示以下错误消息:

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

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

【问题讨论】:

    标签: c# asp.net web-services jquery burp


    【解决方案1】:

    看起来,来自您服务器的响应是一个有效的 JSON 响应,尽管它包含(对您而言)读取为错误的内容。因此,$.ajax(...) 调用将响应视为成功,而不是错误。

    您可以返回一个有效的 JSon 响应,并在该响应中指明是否存在错误,以及任何其他信息,例如用户友好的错误消息、重定向 URL 等。

    $.ajax(...) 调用的error: 处理程序应该用于真实 服务器响应错误(即未处理的 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. 如果 genuine 对 web 服务的调用在正常操作下会产生异常(这通常很糟糕!)您需要验证请求中接收到的数据是否是webservice 方法期望接收(是否接收到数据?它是由 ajax 请求发送的正确结构吗?等等)

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

    【讨论】:

    • 仅在 select (dropdownlist) html 控件的 onchange js 事件上调用 ajax 方法。但是当服务方法的url(www.example.com/somepage.aspx/getDataFromDatabse)直接在浏览器中输入并访问并通过burp套件将GET类型更改为POST时,它会返回一个有效的JSON结果作为你说,但是没有调用 jquery ajax 方法来处理这个 JSON 结果,并且 JSON 结果直接由浏览器以纯文本形式显示。如何处理?
    • @ghouse - 如果我对您的理解正确,当您在浏览器中输入 URL(并将方法更改为 POST)时,jquery $.ajax(...) 永远不会被调用,所以它不会被调用倾听回应。也许我没有完全理解你的问题?
    • 你是对的,因为 jquery $.ajax(...) 仅在 onchange 上被调用,当在浏览器中直接访问 URL 时不会调用它,并且由于 GET 更改为 POST,它是直接在浏览器中以JSON格式显示上述消息。
    • 好吧好吧。所以这是预期的行为。您是否正在尝试实现其他目标?如果是这样,您能否进一步澄清您的问题?或者,如果您的问题现已得到解答,请随时接受。
    • 我想将用户重定向到另一个页面,而不是直接在浏览器中显示此消息{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""},我该如何实现?
    猜你喜欢
    • 2012-02-25
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多