【问题标题】:Redo an AJAX call after failure失败后重做 AJAX 调用
【发布时间】:2015-07-23 15:13:00
【问题描述】:

我正在使用其可用的 REST API 服务访问我的网站,该服务允许我首先进行身份验证,然后使用该身份验证的会话返回值来执行进一步的 API 调用。我可以正常访问它,没有任何问题。会话在一小时后超时。假设我想在一小时后进行 API 调用,我想重新验证并继续进行最初发生的 AJAX 调用。您能否建议我如何重做一个 AJAX 调用,如果会话超时,该调用将首先进行身份验证,然后继续最初存在的原始 AJAX 调用?

$.ajax({
    type: "GET",
    dataType: "json",
    url: "url",
    cache: false,
    async: false,
    success: function (data) {
        alert(data);
    },
    error: function(xhr, textStatus, errorThrown) {
        //$.ajax(this);
        //return;
    },
    statusCode: {
        403: function() {
            var session = retryLogin();
            if(session !== "")
            {
             // call this function again? How can we achieve this?????
            }

        }
    }
});

请告诉我如何再次调用本来应该运行的 ajax 调用?

编辑: 基本上我有两个 AJAX 调用,即一个用于获取会话 ID 的身份验证,另一个是根据该会话 ID 获取一些数据。如果会话 ID 在中途过期,我想重做身份验证调用,然后继续进行最初会发生的 AJAX 调用。关于如何实现这一目标的任何建议?

我还添加了一个图表,只是为了显示我想要实现的目标。

干杯。

【问题讨论】:

  • 由于 retryLogin 必须执行 AJAX 调用,因此它将是异步的。你需要给它传递一个回调,回调会再次调用这个函数。
  • 如果错误代码是无效会话之一(基本上是递归),也许您可​​以将主 ajax 调用包装在一个函数中并在错误句柄中调用它
  • 您能否将其作为答案发布,请提供更多详细信息,以便我尝试一下?

标签: jquery ajax authentication call redo


【解决方案1】:

[我不明白“失败后”对您意味着什么,但从以下内容您将了解行动路线以及如何解决问题]

您可以将 ajax 调用包装在一个函数中,如果出错则再次调用它。

var callMeAgain = function(){
$.ajax({
    type: "GET",
    dataType: "json",
    url: "url",
    cache: false,
    async: false,
    success: function (data) {
        alert(data);
    },
    error: function(xhr, textStatus, errorThrown) {
       callMeAgain();
       //text statuses for error are: "timeout", "error", "abort", and "parsererror"
    }   
});
};

这就是你想要达到的目标?

ajax 调用有一个超时参数,你可以这样做。

  var callMeAgain = function(){
    $.ajax({
        type: "GET",
        dataType: "json",
        url: "url",
        cache: false,
        timeout: 400,
        async: false,
        success: function (data) {
            alert(data);
        },
        error: function(xhr, textStatus, errorThrown) {
            if (textStatus=="timeout") {
                    callMeAgain();
            }
        }   
    });

正如我在类似的答案中看到的,必须补充一点:

为请求设置超时(以毫秒为单位)。这将覆盖 使用 $.ajaxSetup() 设置的任何全局超时。超时时间开始 在进行 $.ajax 调用时;如果有其他几个请求 进度和浏览器没有可用的连接,有可能 请求在发送之前超时。在 jQuery 1.4.x 和 下面,XMLHttpRequest 对象将处于无效状态,如果 请求超时;访问任何对象成员可能会抛出一个 例外。仅在 Firefox 3.0+ 中,脚本和 JSONP 请求不能 因超时取消;即使脚本在之后到达,它也会运行 超时时间。

假设您在一些消息中编写异常,我们将在成功函数中捕获异常。

 var sessionCallVar = function sessionCall () {
   return $.ajax(...);
};

 var callMeAgain = function(){
        $.ajax({
            ......
            success: function (response) {
                if(response.SessionExceptionMessage !== ''){
                    //then we have a session error
                    sessionCallVar().then(callMeAgain);
                  }
            },
            error: function(xhr, textStatus, errorThrown) {
                .........
            }   
        });

基于 Promise 的链式 ajax 调用:How do I chain three asynchronous calls using jQuery promises?

这是我在 asp.net 中采用的某种架构 [我不太了解您的服务器端语言]:ASP.NET MVC Ajax Error handling

错误回调中的Ajax错误处理和处理自定义异常:jQuery Ajax error handling, show custom exception messages

【讨论】:

  • 这不是我真正想要的。基本上我有两个 AJAX 调用,即一个用于获取会话 ID 的身份验证,另一个是根据该会话 ID 获取一些数据。如果会话 ID 在中途过期,我想重做身份验证调用,然后继续进行最初会发生的 AJAX 调用。关于如何实现这一目标的任何建议?
  • 进行对你意味着什么?创建一个将检查您的会话的 ajax 调用 (ajax1)。如果您没有找到任何会话 ID,那么您应该进行另一个 ajax 调用 (ajax2),它将向您返回一个会话 ID,然后进入 ajax2 的成功函数,您可以进行另一个 ajax 调用 (ajax3),它是“将在第 1 次发生地方”。如果您找到会话 ID,那么您应该只调用 ajax3。这就是你想要做的?
  • 是的,这是正确的,但从相反的过程来看。我已经有一个会话已过期,并且我在应用程序的中间,我正在进行 ajax 调用 3,但我没有有效的会话。我想再次调用 ajax 调用 1,然后再调用 ajax 调用 3。
  • 将您的服务器调用包装在一个检查会话对象的方法中,返回一个您可以识别的异常代码并创建一个 $.ajax 包装器来检查您是否收到该异常代码。如果您收到该异常代码,请调用以返回新的会话 ID 并继续调用。我认为这是您想要实现的目标,但非常离题
  • 是的,这就是我想要实现的。您能否将其发布为答案?
【解决方案2】:

如果您由于某种原因长时间失去连接,总是丢失会话信息,我建议使用@RazvanDumitru 建议的答案,但如果您(以任何方式失去互联网连接)并且想要恢复所有您的会话信息,您需要在数据库中进行一些存储(将所有变量打包成 json-string 之类的)并生成一些密钥来识别,当您恢复会话并再次登录新时,从 db 中读取所有变量。

使用https://plugins.jquery.com/cookie/ 存储键值来识别浏览器cookie 中的变量。

注意:如果您想要更高的安全性(显然需要以某种随机形式生成密钥)并且如果您愿意,请使用一些公钥保护它们。然后存储在浏览器中。 您可以使用 javascript 代码或服务器脚本来完成所有这些工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多