问题 在jquery中对303状态代码做出反应(防止重定向)


当我向某个服务器发送请求时,将发出303响应,然后是请求的响应以及200状态代码。 有趣的是,我只在开发人员控制台的网络视图中看到了这一点。检查我的$ .ajax()请求的状态代码和响应时,将会有第二个请求的响应,以及200个http状态代码。

问题是似乎第二个请求被缓存(虽然200状态代码),我真的需要它是不可缓存的。 因此,我真的想介入使用http 303状态代码进行的转发过程。我希望我的jquery函数检查状态代码,然后发送带有显式头的get请求,告诉服务器不要缓存响应。

好吧,我只是不知道如何做到这一点,因为(如上所述)jQuery.ajax方法将响应转发请求的响应和状态代码(200)。

你可以帮我吗?

编辑

10.3.4 303见其他

可以在不同的URI下找到对请求的响应   应该使用该资源上的GET方法检索。这种方法   存在主要是为了允许输出POST激活的脚本   将用户代理重定向到选定的资源。新的URI不是   替换最初请求的资源的引用。 303   响应绝不能缓存,而是对第二个的响应   (重定向)请求可能是可缓存的。

也许我需要以某种方式阻止用户代理重定向自己,所以我可以做重定向?

或者有没有办法简单地告诉服务器/浏览器不要缓存来自客户端的第二个请求?或者阻止它重定向我的请求?或者至少在重定向之前修改第二个请求?


10782
2018-05-02 12:09


起源

除http请求外,我无法访问服务器 - keinabel


答案:


300范围内的回应是透明的。 AFAIK,Web浏览器不会将它们中的任何一个暴露给javascript。因此,处理303不是一种选择。

你试过设置吗? cache ajaxSetup中的属性为false?它会在请求中附加时间戳,防止浏览器缓存响应。您也可以自己手动完成。浏览器应该将第一个请求URL与第二个响应匹配


9
2018-05-21 00:26



看到 w3.org/TR/XMLHttpRequest/#same-origin-request-event-rules - yoelp
这有助于我理解为什么IE没有将JS的响应体返回给303(尽管Chrome确实如此)。谢谢! - Dave Clausen


无法阻止浏览器遵循303重定向。听起来这不是你想要的,无论如何。无论您在浏览器中做什么以防止原始请求被缓存,都应该同样有效地防止重定向200被缓存。也就是说,除了为每个请求使用唯一的URL之外,您在浏览器端几乎无法做到。设置时,jQuery会自动为您完成此操作 cache: false

$.ajax({
  url: "example.html",
  cache: false
  }
}).done(function( html ) {
  $("#results").append(html);
});

2
2018-06-01 18:05





这是旧帖子,但也许有人会觉得这很有用。

我有同样的问题,在我的情况下,问题出在使用ajax调用的方法中。问题出在方法中设置的重定向中。因此,基于此,您不能同时使用ajax和重定向(服务器端),我删除了 redirect()函数从方法,我一切按预期工作。 顺便说一下,我正在使用 codeigniter


0
2017-11-20 19:37





看到 statusCode 你的财产 .ajax() 呼叫

示例:

$.ajax({
  statusCode: {
    303: function() {
      alert("page not found");
    }
  }
});

-1
2018-05-02 12:13



就像我说的: ”检查我的$ .ajax()请求的状态代码和响应时,将会有第二个请求的响应,以及200个http状态代码。“..这种方法也是如此。我用$ .ajax({statusCode:{303:function(){alert(303);},200:function(){alert(200);}}}}尝试了它;它总是跳进200方法。 - keinabel
有没有解决方法如何获取303响应的数据? - user3206010