Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery AJAX重定向难题,如何获取重定向URL或如何设置重定向请求的属性_Jquery_Ajax_Redirect_Xmlhttprequest - Fatal编程技术网

Jquery AJAX重定向难题,如何获取重定向URL或如何设置重定向请求的属性

Jquery AJAX重定向难题,如何获取重定向URL或如何设置重定向请求的属性,jquery,ajax,redirect,xmlhttprequest,Jquery,Ajax,Redirect,Xmlhttprequest,首先,如果有帮助的话,我在谷歌浏览器工作。以下是行为: 我通过jQuery向远程站点发送xhr请求(这是一个chrome扩展,我已经设置了所有跨站点设置…): 正在设置的URL返回302(这是预期的),Chrome遵循重定向(也是预期的) 新的URL返回提示输入凭据,这些凭据不是从原始请求中提取的,因此Chrome显示一个登录对话框。如果我输入原始凭据,我会得到一个关于发送的无效请求的响应(这是一个有效的HTTP请求--200--远程服务器只是不喜欢其中一个头) 在Chrome中查看开发者窗口时

首先,如果有帮助的话,我在谷歌浏览器工作。以下是行为:

我通过jQuery向远程站点发送xhr请求(这是一个chrome扩展,我已经设置了所有跨站点设置…):

正在设置的URL返回302(这是预期的),Chrome遵循重定向(也是预期的)

新的URL返回提示输入凭据,这些凭据不是从原始请求中提取的,因此Chrome显示一个登录对话框。如果我输入原始凭据,我会得到一个关于发送的无效请求的响应(这是一个有效的HTTP请求--200--远程服务器只是不喜欢其中一个头)

在Chrome中查看开发者窗口时,会发送两个请求。第一个是使用AJAX请求中设置的所有设置返回原始URL。第二个是重定向URL,使用“GET”方法,“POST”字段中没有任何内容,也没有凭据

我不知道我能做什么。我需要:

  • 获取重定向URL,以便我可以发送第二个请求(
    xhr.getResponseHeader(“位置”)
    不起作用)

  • 让新重定向请求保留原始请求的设置,或

  • 获取错误来源的最终URL,以便我可以发送另一个请求


  • 理想情况下,我不希望用户在这个对话框中第二次输入他们的凭据,但如果我能得到最终的URL,我会得到我能得到的。

    不幸的是,没有办法阻止xhr自动跟踪重定向或为重定向目的地设置凭据(无论如何,这将是相当不安全的,因为这将允许第一个站点将凭据重定向到任何站点,而不仅仅是您想要获取凭据的站点)。

    您可以尝试下面描述的解决方案类型:

    这意味着实际上要取代HTTP协议,您还需要控制服务器。所有ajax响应都将使用json对象以代码200(或者至少是3xx响应,而不是401/403)的形式出现。在这个json对象中,您可以提供一些特殊的错误代码(为什么不重用 然后扩展jQuery.ajax函数,在json响应中捕获这些特殊代码,并发出所需的新请求。事实上,自动jQuery重定向调用是由您完成的,而不是由jQuery完成的


    起初这看起来很难看,但在处理链接中建议的问题时(会话结束,登录页面重定向)在客户端和服务器之间的ajax json通信中有一个完整的协议处理似乎不是一个坏主意。

    如果您控制服务器,您可能会将丢失的数据嵌入重定向地址本身。因此,xhr进行POST,然后对(由服务器)编码的部分发布数据进行GET就像你得到的一样。
    没有其他解决方案可供我使用…

    基于您的问题,我不完全确定您指的是HTTP身份验证还是基于表单的身份验证方案,因此我将同时解决这两个问题

    获取重定向URL以便发送第二个请求(xhr.getResponseHeader(“位置”)不起作用)

    按照XHR的一般构建方式(特别是在Chrome中): XHR不是很灵活,它提供了一个相对高级的API,与浏览器在所有其他请求(地址栏URL、图像源URL、嵌入式脚本URL)中的行为相同,即重定向是透明处理的。JavaScript中不会抛出任何事件提醒您此重定向或中间302/301状态代码,您只会收到最终状态代码和数据。因此,无法从响应中检索“Location”标头,因为最终响应不包含“Location”标题

    让新重定向请求保留原始请求的设置

    XHR没有将此作为选项提供,这将是不正确的默认行为。有关默认情况下为什么会发生和不应该发生这种情况的示例:

    Acme corp为其员工提供URL短链接服务。我单击从同事处收到的短链接,Acme的短链接服务会提示我进行HTTP身份验证。此身份验证后会发生重定向。重定向到的站点没有理由需要我的凭据,因此它将被删除浏览器传递此信息的行为不正确(实际上是一个安全问题)。同样,不应转发POST数据,因为它只能由预直接URL使用

    获取错误来源的最终URL,以便我可以发送另一个请求

    不幸的是,出于安全原因和标准定义,标准XHR对象(包括Chrome在扩展中用于跨站点请求的对象)不提供任何访问最终URL的方法,该URL有错误。您只能访问最终HTTP状态和最终URL返回的任何数据

    --

    鉴于此,根据您对情况的控制程度,您有几个选择:

    < P > 1)如果您对重定向服务器有控制,请考虑包含信息。在AJAX请求中指示Ajax客户机,并具有服务器,而不是返回数据(即JSON对象),指示应进行重定向。< /P>

    或者,如果意图总是传递认证数据,考虑实现一些会话传递机制或包括身份验证信息。在URL重定向到目的URL时,可以使用此信息。

    2)如果您控制重定向的目的地,考虑在生成验证失败页时包含目的地的URL。XHR对象将有权访问此响应数据,并可以对其进行解析以继续处理新请求

    3)如果您无法控制重定向站点或目的地站点,请考虑H

    $.ajax({
        type: "POST",
        contentType : "text/xml",
        url: some_url,
        data: some_xml,
        username: user,
        password: pass,
        success: function(data,status,xhr){
            alert(data);
        },
        error: function(xhr, status, error){
            alert(xhr.status);
        }
    });