Jør*_*gen 100 javascript jquery
我使用jQuery ajax函数来访问Web服务,但是服务器不是返回带有描述问题的状态代码的响应,而是将请求重定向到具有200头的页面,描述问题.我无法对此进行任何更改,因此我需要以某种方式在客户端上解决它.
示例:请求转到某个找不到的URL,因此我收到302重定向到另一个位置.发送一个新请求,我收到200 OK,从而防止错误回调触发.
有什么方法可以阻止ajax请求跟随重定向,而是调用回调,最好是错误方法.或者,是否可以检测客户端中是否发生了重定向?
Ole*_*leg 92
我觉得你的问题很有意思,但整个问题似乎更让我误解了.至少我会试着解释一下我对这个问题的理解.
沉默的(透明)重定向的部分XMLHttpRequest规范(见这里特别将"...透明跟随重定向...").标准仅提到用户代理(Web浏览器)可以阻止或通知某些类型的自动重定向,但它不是其中的一部分XMLHttpRequest.它是HTTP客户端配置(操作系统配置)或Web浏览器配置的一部分.所以jQuery.ajax不能有任何阻止重定向的选项.
您可以看到HTTP重定向是HTTP协议的一部分,而不是HTTP协议的一部分XMLHttpRequest.所以它在另一个抽象层或网络堆栈上.例如,XMLHttpRequest可以从HTTP代理或本地浏览器缓存中检索来自的数据,它是HTTP协议的一部分.主要是提供数据而不是客户端的服务器可以影响缓存.
您可以将问题中的要求与防止在通信期间更改Web服务器的IP地址或更改IP路由的要求进行比较.在某些情况下,所有的事情都可能很有趣,但是通信堆栈的另一个层次的部分是无法通过jQuery.ajax或管理的XMLHttpRequest.
该XMLHttpRequest标准说,客户端配置能够具有防止重定向选项.在"微软世界"的情况下,我更好地了解,您可以查看WinHttpSetOption函数,该函数可用于设置值的WINHTTP_OPTION_DISABLE_FEATURE选项WINHTTP_DISABLE_REDIRECTS.另一种方法是使用WINHTTP_OPTION_REDIRECT_POLICY带有WINHTTP_OPTION_REDIRECT_POLICY_NEVER值的选项.可以在Windows中使用的另一个功能是WinHttpSetStatusCallback函数,它可以设置回调函数接收一些通知,如WINHTTP_CALLBACK_FLAG_REDIRECT.
因此,一般情况下可以实现您的要求,但解决方案可能不是独立于操作系统或Web浏览器,并且不在jQuery.ajax或级别XMLHttpRequest.
Jak*_*sel 23
我不相信这是可能的.底层库(XHR)透明地生成新请求.话虽这么说,我在这些情况下所做的事情(通常是将我带到登录页面的会话超时类型的交易)发送回自定义响应头.我还设置了一个全局的ajax处理程序,用于检查是否存在该标头,并在存在时作出适当的响应(例如,将整个页面重定向到登录屏幕).
如果您有兴趣,这里是我必须为该自定义标头观看的jQuery代码:
/* redirects main window when AJAX request indicates that the session has expired on the backend. */
function checkSession(event, xhr, ajaxOptions)
{
if (xhr.readyState == 4)
{
if(xhr.getResponseHeader("Login-Screen") != null && xhr.getResponseHeader("Login-Screen").length)
{
window.location.href='sessionExpired.html'; //whatever
}
}
}
$(document).ajaxComplete(checkSession)
Run Code Online (Sandbox Code Playgroud)
Tak*_*man 10
我找到了一项功能,可以检查您的呼叫是否已被重定向.它是xhr.state():如果它被"拒绝",那么就会发生重定向.
成功回调的示例:
request.success(function(data, textStatus, xhr)
{
if(xhr.state() == "resolved")
{
//no redirection
}
if(xhr.state() == "rejected")
{
//redirection
}
});
Run Code Online (Sandbox Code Playgroud)
错误回调示例:
request.error(function(xhr, textStatus)
{
if (xhr.state() == "rejected")
{
//redirection
location.href = "loginpage";
} else
{
//some other error happened
alert("error");
}
});
Run Code Online (Sandbox Code Playgroud)
小智 -4
在 ajax 请求的请求标头中,您将有以下内容
X-Requested-With XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)
通过服务器端的此标准,您可以过滤请求。