Symfony $request->isXmlHttpRequest() issue

2020-07-05 04:59发布

问题:

I need to check if the request is ajax. $request->isXmlHttpRequest() works fine, however if there is a redirect somewhere during the execution, this method will return false. How else can I check if request is ajax in this case? p.s. ajax is initiated by jQuery

回答1:

If you arent redirecting to a different application in your project or another external uri just use forward instead if isXmlHttpRequest is true on the first request.


Well that method checks against the value of the X-Requested-with header and in some browser implementations that header (or all original headers) are dropped/overwritten from the redirected request (FF to name one).

As a workaround you could use a variable in the request itself. You might be able to use the existing sf_format infrastructure, but im not sure if that would work because im not familiar with how it works internally.



回答2:

Some js libraries doesn't send the XmlHttpRequest value in the headers, juste add this in your script:

xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");


回答3:

If you need an easy workaround, I would suggest

Use a URL like http://mywebsite.com/loadsomething.php?ajax=true and

$isAjax = $request->getParameter('ajax');

Or, if you are POSTing you can create a hidden field named "ajax" . Ofcourse these won't solve your problem forever but will work as a quick fix if you need this as soon as possible.

If you want to support only one redirect, you can create a flash variable as well.

Otherwise you can look at the source code of symfony:

http://trac.symfony-project.org/browser/branches/1.4/lib/request/sfWebRequest.class.php

On line 518 you can see the request object identifies the request to be ajax from the HTTP headers. So you have to find out that after the redirect why the same HTTP headers are not set properly.