|
|
1
653
我阅读了这个问题,并实现了有关将响应状态代码设置为278的方法,以避免浏览器透明地处理重定向。尽管这很有效,我还是有点不满意,因为这有点像一个黑客。 在更多的挖掘之后,我放弃了这种方法并使用了 JSON .在这种情况下,对Ajax请求的所有响应都具有状态代码200,响应主体包含一个在服务器上构建的JSON对象。然后,客户机上的JavaScript可以使用JSON对象来决定它需要做什么。 我有一个和你类似的问题。我执行的Ajax请求有两个可能的响应:一个将浏览器重定向到新页面,另一个将当前页面上现有的HTML表单替换为新页面。要执行此操作的jquery代码如下所示:
JSON对象“data”是在服务器上构建的,有两个成员:data.redirect和data.form。我发现这种方法好多了。 |
|
|
2
220
我通过以下方式解决了这个问题:
|
|
3
109
没有浏览器能够正确处理301和302响应。实际上,标准甚至说他们应该“透明地”处理它们,这对于Ajax库供应商来说是一个巨大的难题。在 Ra-Ajax 我们被迫使用HTTP响应状态代码278(只是一些“未使用”的成功代码)来透明地处理来自服务器的重定向… 这真的让我很恼火,如果这里有人在W3C中有一些“拉动”,我会很感激你可以让W3C 知道 我们真的需要自己处理301和302代码…!;) |
|
|
4
88
最终实现的解决方案是为Ajax调用的回调函数使用包装器,并在此包装器中检查返回的HTML块上是否存在特定元素。如果找到元素,则包装器执行重定向。如果不是,包装器将调用转发到实际的回调函数。 例如,我们的包装函数类似于:
然后,在进行Ajax调用时,我们使用了如下方法:
这对我们很有用,因为所有的Ajax调用总是返回DIV元素内的HTML,我们使用它来替换页面的一部分。另外,我们只需要重定向到登录页面。 |
|
|
5
60
我喜欢Timmerz的方法加上一点柠檬。如果你回来了 内容类型 属于 文本/ HTML 当你期待的时候 杰森 ,您很可能被重定向。在我的例子中,我只需重新加载页面,它就会被重定向到登录页面。哦,检查一下jqxhr的状态是200,这看起来很傻,因为您在错误函数中,对吧?否则,合法的错误案例将强制进行迭代重新加载(oops)
|
|
|
6
46
使用低级
尝试此重定向:
|
|
|
7
32
我只是想分享我的方法,因为这可能会帮助某人: 我基本上包括了一个javascript模块,它处理诸如显示用户名之类的身份验证,并且这个案例处理 重定向到登录页 . 我的场景:我们基本上有一个ISA服务器,它在其中监听所有请求和 用302和位置标题响应 登录页面。 在我的javascript模块中 初始进近 有点像
问题(正如前面提到的那样)是浏览器自己处理重定向,因此
解决方案
由于无法捕获302个重定向响应,我添加了
…这就像魅力一样。你可能想知道为什么我在
|
|
|
8
28
我知道这个话题已经过时了,但我将给出另一种我已经找到并描述过的方法。 here . 基本上我用的是ASP.MVC和WIF (但这对本主题的上下文并不重要-无论使用哪种框架,答案都是充分的。线索保持不变-在执行Ajax请求时处理与身份验证失败相关的问题) . 下面所示的方法可以应用于所有现成的Ajax请求(如果它们没有明显地重新定义beforesend事件)。
在执行任何Ajax请求之前
如果用户未通过身份验证(令牌已过期),则无法访问该方法(受
最后在客户端检查这样的自定义头。如果存在-应完全重定向到登录页(在我的情况下
|
|
|
9
22
我认为更好的处理方法是利用现有的HTTP协议响应代码,特别是
我是这样解决的:
IMO这是更通用的,您没有编写一些新的自定义规范/头文件。您也不必修改任何现有的Ajax调用。 编辑: 根据@rob下面的评论,401(验证错误的HTTP状态代码)应该是指示器。见 403 Forbidden vs 401 Unauthorized HTTP responses 更多细节。也就是说,一些Web框架使用403来处理身份验证和授权错误——因此要相应地进行调整。谢谢Rob。 |
|
|
10
21
我这样解决了这个问题: 添加中间件来处理响应,如果它是针对Ajax请求的重定向,则使用重定向URL将响应更改为正常响应。
然后在AjaxComplete中,如果响应包含重定向,则它必须是重定向,因此请更改浏览器的位置。
|
|
|
11
18
大多数给定的解决方案都使用一个变通方法,使用一个额外的头或一个不适当的HTTP代码。这些解决方案很可能会奏效,但感觉有点“黑客”。我想出了另一个解决办法。 我们使用的WIF配置为在401响应上重定向(passiveredDirectEnabled=“true”)。重定向在处理普通请求时很有用,但对Ajax请求无效(因为浏览器不会执行302/Redirect)。 使用global.asax中的以下代码,可以禁用Ajax请求的重定向:
这允许您为Ajax请求返回401个响应,然后您的javascript可以通过重新加载页面来处理这些响应。重新加载页面会抛出一个401,由wif处理(wif会将用户重定向到登录页面)。 处理401错误的示例javascript:
|
|
|
12
17
我发现的另一个解决方案(如果要设置全局行为,尤其有用)是使用
替换
|
|
|
13
17
然后使用ASP.NET MVC RedirectToAction方法可能会出现此问题。为了防止表单在DIV中显示响应,您可以简单地使用某种Ajax响应过滤器将响应与 Ajax安装程序 . 如果响应包含MVC重定向,则可以在JS端评估此表达式。下面是JS的示例代码:
如果数据是: “window.location='/a帐户/登录'” 上面的过滤器将捕捉到这一点,并进行计算以进行重定向,而不是让数据显示出来。 |
|
|
14
16
把弗拉基米尔·普鲁德尼科夫和托马斯·汉森的话综合起来:
这使得浏览器将响应视为成功,并将其提交给您的javascript。
|
|
|
15
16
我有一个简单的解决方案,对我有效,不需要更改服务器代码…只需添加一汤匙肉豆蔻…
我检查是否存在HTML标记,但您可以更改indexof以搜索登录页中存在的任何唯一字符串… |
|
|
16
12
尝试
把它放在登录页面上。如果它被加载到主页面上的一个DIV中,它将重定向到登录页。“#站点”是一个DIV的ID,它位于除登录页面之外的所有页面上。 |
|
|
17
12
|
|
|
18
11
我通过在login.php页面中放置以下内容来解决这个问题。
|
|
|
19
11
如果您使用的是Spring安全性,那么答案似乎对人们有用,但是我发现扩展了LoginLauthenAuthenticationEntryPoint,并添加了特定的代码来处理Ajax,使其更加健壮。大多数例子被截取 全部的 重定向不只是身份验证失败。这对我从事的项目来说是不可取的。如果不希望缓存失败的Ajax请求,您可能会发现还需要扩展exceptiontranslationfilter并重写“sendstartauthentication”方法以删除缓存步骤。 示例AjaxawareAuthenticationEntryPoint:
|
|
|
20
7
有些人可能会发现以下内容很有用: 我希望客户机被重定向到登录页面,以执行在没有授权令牌的情况下发送的任何REST操作。由于我所有的REST操作都是基于Ajax的,所以我需要一种好的通用方法来重定向到登录页面,而不是处理Ajax成功函数。 这就是我所做的: 在任何Ajax请求上,我的服务器都会返回JSON200响应“需要认证”(如果客户机需要认证)。 Java(服务器端)的简单示例:
在我的javascript中,我添加了以下代码:
这就是问题所在。 |
|
|
21
6
我再引用一下@steg所描述的问题。
imho这是一个真正的挑战,必须正式扩展到当前的HTTP标准。
我相信新的HTTP标准将使用新的状态代码。
含义:目前
在扩展标准中,如果响应
有人这么说,我倾向于模仿这个 未来 行为,因此当需要document.redirect时,我让服务器响应为:
当JS得到
这对你有意义吗? |
|
|
22
5
你应该把
在$.Ajax函数中,不应使用
问题是它不是很灵活,你不能决定你要重定向到哪里。 通过servlet重定向应该是最好的方法。但我还是找不到正确的方法。 |
|
|
23
5
我只想锁定整个页面的任何Ajax请求。@Superg让我开始了。以下是我的结论:
我想专门检查某些HTTP状态代码,以确定我的决策依据。但是,您可以绑定到ajaxerror以获得成功以外的任何东西(可能只有200个?)我本可以写:
|
|
|
24
5
如果您还想传递这些值,那么您还可以设置会话变量并访问 如: 在JSP中,您可以编写
然后你可以把这个温度值存储在你的javascript变量中,然后四处游玩。 |
|
|
25
5
我没有任何成功的头部解决方案-他们从来没有在我的AjaxSuccess/AjaxComplete方法。我在自定义响应中使用了steg的答案,但是我修改了一些JS端。我设置了一个在每个函数中调用的方法,以便使用标准
使用中的示例…
|
|
|
26
5
最后,我通过添加自定义
服务器上的应用程序类型是
它非常适合我!现在在每一个回应中
另一件重要的事情是,不需要在服务器端或客户机端修改代码。 下一个功能是以这种方式访问操作后的其他信息,如错误、消息和…。 我贴了这个,也许能帮助别人:) |
|
27
4
我在一个我正在修补的django应用程序上遇到了这个问题(免责声明:我正在修补以学习,绝不是专家)。我想做的是使用jquery ajax向资源发送一个删除请求,在服务器端删除它,然后发送一个重定向回(基本上)主页。当我发送
然后我使用jquery.ajax在客户机上发送/处理请求,如下所示:
也许使用300不是“正确的”,但至少它能像我想要的那样工作。 附言:这是一个巨大的痛苦,编辑在移动版的SO。愚蠢的ISP把我的服务取消请求通过权利当我完成我的答案! |
|
|
28
4
您还可以挂接xmlhttprequest send原型。这将适用于所有发送(jquery/dojo/etc)和一个处理程序。 我编写这段代码是为了处理一个500页的过期错误,但它也可以捕获一个200页的重定向。准备好维基百科条目 XMLHttpRequest OnReadyState更改ReadyState的含义。
|
|
|
29
1
此外,您可能希望将用户重定向到给定的in headers url。最后看起来是这样的:
UPD:OPPS。有相同的任务,但不起作用。做这些事。当我找到答案时,我会给你看。 |
|
|
30
0
我用@john和@arpad的答案得到了一个有效的解决方案 link 和@罗宾奇 link 我使用SpringSecurity 3.2.9和jQuery1.10.2。 扩展Spring的类以仅从Ajax请求引起4xx响应:
applicationContext-security.xml文件
在我的JSP中,添加一个全局Ajax错误处理程序,如图所示。 here
另外,从JSP页面中的Ajax调用中删除现有的错误处理程序:
我希望它能帮助别人。 更新1 我发现我需要将选项(总是使用默认的target=“true”)添加到表单登录配置中。 这是必需的,因为在Ajax请求被重定向到登录页面后(由于会话过期),Spring会记住以前的Ajax请求,并在登录后自动重定向到该请求。这将导致返回的JSON显示在浏览器页面上。当然,不是我想要的。
更新2
而不是使用
|