【发布时间】:2011-06-07 05:23:52
【问题描述】:
我需要检查请求是否是 ajax。 $request->isXmlHttpRequest() 工作正常,但是如果在执行过程中某处有重定向,此方法将返回 false。在这种情况下,我还能如何检查请求是否是 ajax?
p.s. ajax由jQuery发起
【问题讨论】:
我需要检查请求是否是 ajax。 $request->isXmlHttpRequest() 工作正常,但是如果在执行过程中某处有重定向,此方法将返回 false。在这种情况下,我还能如何检查请求是否是 ajax?
p.s. ajax由jQuery发起
【问题讨论】:
如果您没有重定向到项目中的其他应用程序或另一个外部 uri,则如果 isXmlHttpRequest 在第一个请求上为 true,则使用 forward 代替。
该方法会检查 X-Requested-with 标头的值,并且在某些浏览器实现中,标头(或所有原始标头)会从重定向请求中删除/覆盖(FF 举个例子)。
作为一种解决方法,您可以在请求本身中使用变量。您也许可以使用现有的 sf_format 基础架构,但我不确定这是否可行,因为我不熟悉它的内部工作原理。
【讨论】:
forward 而不是isXmlHttpRequest 在第一个请求中为真?
sfView::NONE 并使用setLayout(false) 在操作中覆盖它,如果sf_format 是您用于ajax 的任何内容。但我的意思是使用 sf_Format 并没有那么特别,它与手动添加一些您将用来检测 ajax 的任意参数做同样的事情 - 它已经存在了。
一些 js 库不会在标头中发送 XmlHttpRequest 值,只需将其添加到您的脚本中即可:
xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
【讨论】:
如果你需要一个简单的解决方法,我会建议
使用像http://mywebsite.com/loadsomething.php?ajax=true 这样的网址和
$isAjax = $request->getParameter('ajax');
或者,如果您正在发布,您可以创建一个名为 "ajax" 的隐藏字段。当然,这些不会永远解决您的问题,但如果您需要尽快解决,它们可以作为快速解决方案。
如果你只想支持一个重定向,你也可以创建一个 flash 变量。
否则你可以看看symfony的源码:
http://trac.symfony-project.org/browser/branches/1.4/lib/request/sfWebRequest.class.php
在第 518 行,您可以看到请求对象从 HTTP 标头中将请求标识为 ajax。所以你必须在重定向之后找出为什么相同的 HTTP 标头设置不正确。
【讨论】: