失败后重做AJAX调用

时间:2015-05-12 16:03:00

标签: jquery ajax authentication call redo

我正在使用我可用的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调用。关于如何实现这一目标的任何建议?

我还添加了它的图表,以显示我想要实现的目标。

Scenario

干杯。

2 个答案:

答案 0 :(得分:11)

[我不明白“失败后”对您意味着什么,但从以下情况您将了解行动方式以及如何处理您的问题]

你可以在一个函数中包装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) {
                .........
            }   
        });

根据承诺链接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

答案 1 :(得分:0)

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

使用https://plugins.jquery.com/cookie/存储键值以在浏览器Cookie中标识您的变量。

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