我正在使用我可用的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调用。关于如何实现这一目标的任何建议?
我还添加了它的图表,以显示我想要实现的目标。
干杯。
答案 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代码或服务器脚本完成所有这些工作。