AJAX重定向困境,如何获取重定向URL或如何设置重定向请求的属性

Ant*_*ony 22 ajax jquery redirect xmlhttprequest

首先,我在Google Chrome中工作,如果有帮助的话.这是行为:

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

$.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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

在Chrome中查看开发者窗口时,会发送两个请求.第一个是原始URL,其中包含AJAX请求中设置的所有设置.第二个是重定向URL,方法为"GET","POST"字段中没有任何内容,也没有凭据.

我不知道我能做什么.我要么:

  1. 获取重定向网址,以便我可以发送第二个请求(xhr.getResponseHeader("Location")不起作用),

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

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

理想情况下,我不希望用户必须在此对话框中第二次输入他们的凭据,但如果我能获得最终的URL,我会采取我能得到的.

Raj*_*ani 13

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

获取重定向URL,以便我可以发送第二个请求(xhr.getResponseHeader("Location")不起作用),

通过XHR的构建方式(特别是在Chrome中):XHR不是很灵活,并提供相对高级的API,浏览器在所有其他请求中具有相同的行为(地址栏网址,图像源网址,嵌入式脚本网址),即重定向是透明处理的.JavaScript中不会抛出任何事件,提醒您此重定向或中间302/301状态代码,您只会收到最终的状态代码和数据.因此,无法从响应中检索"位置"标头,因为最终响应将不包含"位置"标头.

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

XHR不提供此选项,它将是一个不正确的默认行为.为什么在默认情况下会发生这种情况的示例:

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

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

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

-

鉴于此,您可以选择一些选项,具体取决于您对情况的控制程度:

1)如果您可以控制重定向服务器,请考虑包含信息.在您的AJAX请求中指示一个AJAX客户端,并让服务器返回数据(即一个json对象),指示应该进行重定向.

或者,如果打算始终传递身份验证数据,请考虑实现一些会话传递机制或包括身份验证信息.在重定向到的URL中,目标URL可以使用此信息.

2)如果您可以控制重定向的目标,请考虑在生成身份验证失败页面时包含目标的URL.XHR对象可以访问此响应数据,并可以解析它以继续执行新请求.

3)如果您无法控制重定向站点或目标站点,请考虑托管代理服务器以处理请求并特别捕获302.

http://myserver/?url=http://redirectsite.com&user=...&pass=...

4)如果以上都不是选项,那么最不可取但又可行的选择是为运行本机代码的Chrome构建NPAPI扩展.这将使您完全控制请求,并允许您做任何事情.但请注意,这是以更复杂的开发,潜在的安全问题和更少的用户需求为代价的.


Thi*_*ter 0

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

  • 除此之外,仅当新 URL 满足同源策略时才会重定向。那么有没有办法在事后获取URL呢? (2认同)