jquery ajax 302不跳转,关于jquery:在AJAX调用中,未遵循302

我正在使用jQuery 1.6.2向同一域上的页面发出POST AJAX请求。 该页面将302重定向到另一个页面。

现在,在我的本地计算机上工作正常,但在我们的生产服务器上,从未遵循重定向,并且在Chrome检查器中,该请求被称为"已取消"。

ezRtw.png

如果我在不涉及javascript的情况下访问同一页面,一切正常,正如我所说,AJAX可以在我的本地机器上运行,但不能在生产服务器上运行。

有谁知道这会导致什么?

服务器之间存在一些差异(OS X,Apache2,PHP5.3.6,本地计算机上的HTTP,Ubuntu,Lighttpd,PHP5.3.3,生产中的HTTPS),但对我来说没有任何区别应该有所不同。

我假设302重定向到同一域上的另一个资源?

确实。 事实证明,kohana中存在一个错误,但导致重定向是HTTP而不是HTTPS。 这必定导致浏览器取消请求。

优秀。 将其作为下面的答案添加 - 在两天内,您将能够接受您的答案作为正确的答案,以便将来有类似问题的人可以找到它。

知道了谢谢!

结果是重定向代码中的错误导致重定向转到http://,而请求的页面是https://。这使得浏览器拒绝遵循重定向。

那么你如何解决你的问题,就像我面对的一样。

function doAjaxCall() {

$.ajaxSetup({complete: onRequestCompleted});

$.get(yourUrl,yourData,yourCallback);

}

function onRequestCompleted(xhr,textStatus) {

if (xhr.status == 302) {

location.href = xhr.getResponseHeader("Location");

}

}

以下与您的答案相关的问题。你可以从下面的链接找到答案。

在JavaScript中捕获302 FOUND

如何在jQuery Ajax调用之后管理重定向请求

浏览器不应该将302传递给JS,因为浏览器会透明地处理重定向,因此jQuery永远不会知道它被重定向。我不清楚这是否是所有浏览器,但是Chrome显然是这样做的,而其他人已经报道了Opera / FF。

'浏览器不应该通过302给JS'并不意味着你必须投票给答案。尝试上面的代码你的自己然后把正确的答案,如果这是错误而不是在不知情的情况下投票。并看到3个赞成票

xhr.status == 302永远不会发生,因为302将由浏览器处理,然后只会向JS返回200或其他错误代码,所以我认为这会适得其反。我会删除-1但是因为你链接到其他问题。我将提供一个不同的答案。

看来我不能不投票,除非你编辑答案,对不起麻烦。

看问题中的截图。它说302.根据你的评论,它可能是浏览器没有处理。所以在这种情况下我们也必须捕获该错误代码。顺便说一句,你应该能够删除-1

我不认为代码片段是一个很好的解决方案。考虑到你正在向服务器web apis发出一堆ajax调用,然后突然,你的登录过期,响应是登录页面的302。但是,您永远不会知道您的登录何时到期,因此您必须将此处理添加到所有ajax调用。请检查:stackoverflow.com/questions/34325823/

@DanH为什么有人认为302被浏览器透明处理是件坏事。

顺便说一下,这段代码与@Strelok在这里发布的代码完全相同:stackoverflow.com/questions/373087/,投票率很低。答案是早一点。

@smwikipedia我没有说浏览器透明地处理它是不好的,但是当浏览器透明地处理302时,JS将永远不会收到状态为302的XHR。

@DanH也许我不知道你的具体情况。但这正是我想要的。

我认为这是服务器端问题,而不是客户端问题。浏览器在https发出ajax请求时不遵循http的重定向是正确的,因为这将是一个安全漏洞。

我意识到我正在使用相对路径,例如HttpResponseRedirect('/path/to/')。在某个图层上,该网址前面加上http://前缀,这就是浏览器收到的内容:http://example.com/path/to/

您必须确保Location在响应头中以完整路径发送,包括https://。

根据这个答案:https://stackoverflow.com/a/8752354/698289我发现以下代码非常有用:

$('body').ajaxComplete(function (e, xhr, settings) {

if (xhr.status == 200) {

var redirect = null;

try {

redirect = $.parseJSON(xhr.responseText).redirect;

if (redirect) {

window.location.href = redirect;

}

} catch (e) {

return;

}

}

});

然后你只需提供如下的JSON:

{redirect: '/redirect/to/this/path'}

ajaxComplete将确保重定向浏览器。

请注意$.ajax('complete')触发AFTER $.ajax('success')或$.ajax('error')

我不认为这是一个很好的解决方案。这是否意味着我必须把它放在每一页上?如果我理解错了,请纠正我。

上面的代码是Javascript,因此只有在需要的每个页面上的Web浏览器中加载它时才会运行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值