是$request->;isXmlHttpRequest()在symfony2中是否可靠? 让我们考虑下面这样的场景: 用户选择filter按钮,该按钮创建对symfony2控制器的AJAX调用,并以JSON格式返回结果 用户选择一些其他链接,系统会将其重定向到该页面 用户选择浏览器后退按钮 用户将看到JSON响应,但他应该看到原始页面
我的控制器如下所示:是$request->;isXmlHttpRequest()在symfony2中是否可靠? 让我们考虑下面这样的场景: 用户选择filter按钮,该按钮创建对symfony2控制器的AJAX调用,并以JSON格式返回结果 用户选择一些其他链接,系统会将其重定向到该页面 用户选择浏览器后退按钮 用户将看到JSON响应,但他应该看到原始页面,ajax,symfony,Ajax,Symfony,我的控制器如下所示: /** * * * @Route("/ajax", name="ajax_route" , options={"expose"=true}) * @Template() */ public function someAction() { $request = $this->getRequest(); $json = array( ); if($request->isXmlHttpRequest()) {
/**
*
*
* @Route("/ajax", name="ajax_route" , options={"expose"=true})
* @Template()
*/
public function someAction()
{
$request = $this->getRequest();
$json = array( );
if($request->isXmlHttpRequest())
{
$res = json_encode($json);
return new Response($res , 200 , array( 'Content-Type' => 'application/json' ));
}
return array( );
}
换句话说,如果用户按下后退按钮,if($request->isXmlHttpRequest())
返回true,这不是我想要的结果。这是正常的行为还是什么 是一种简单实用的方法,用于检查HTTP请求是否产生了值为XMLHttpRequest
的X-request-with
头。因此它与X-request-With
header一样可靠
然而,这并不重要。需要注意的重要一点是,当用户单击后退按钮时,浏览器不会向服务器发送新的HTTP请求。它只是从内存/缓存中恢复页面。我知道这是一个老问题,但同样的问题刚刚抓住了我,所以我想我还是要写一个答案 在大多数情况下,您可以通过将onUnload处理程序附加到窗口来使back按钮缓存无效,如下所示:
window.addEventListener('unload',function(){});
或者,如果您更喜欢jQuery:
$(window).unload(function(){});
但是,由于AJAX响应是JSON格式的,这显然是不可能的,因为您不能包含脚本片段。在这种情况下,我认为最好的办法是设置缓存控制:no store
标题,这样浏览器就不会试图缓存结果
在使用Symfony2的OP案例中,您可以使用:
return new Response($res , 200 , array(
'Content-Type' => 'application/json',
'Cache-Control' => 'no-store',
));
或者对于更通用的PHP:
header('Cache-Control: no-store');
这里有一个警告,它可能会降低您的性能相当多,这取决于您的应用程序的结构,在这种情况下,您最好的选择可能是为您的AJAX调用使用不同的URL。糟透了,我知道
您可以在bfcache上找到一些文档,这些文档在不同情况下可能更有用。浏览器仅使用url和请求方法(GET、POST等)作为键来缓存响应 如果您想让浏览器识别其他变体,可以通过在响应中设置Vary标题来告诉它这样做。因此,在您的情况下,您希望告诉浏览器,来自服务器的响应将根据请求中是否设置了“X-Requested-With”头而有所不同 以下是如何做到这一点:
$response = new Response();
$response->setVary("X-Requested-With"); // <=========== Set the Vary header
if($request->isXmlHttpRequest()) {
//...
}
return $response;
$response=newresponse();
$response->setVary(“X-request-With”);//isXmlHttpRequest()){
//...
}
返回$response;
注意:您希望在响应的两个版本上都设置Vary头(这就是为什么我在if语句之外设置它)。如何避免返回按钮问题?请注意,Symfony2具有用于处理JSON数据响应的JsonResponse类。使用新的JsonResponse($json)或新的(JsonResponse)->setData($json)