2016-04-12 45 views
1

我有以下方法验证分化执行

private function adminRequired($accessControl) 
{ 
    $user = new \CloseCall\ValueObject\User(2); 
    if(!$accessControl->isAdmin($user)) { 
     header("location: /auth"); 
     http_response_code(401); 
    } 
} 

在我的控制,这种方法总是跑作为控制器构造检查用户是否具有管理员priveleges与否。

我遇到的问题是,XHR请求也可能发送到此控制器,并且header重定向不适合于此,在这种情况下,我想要发送一个401 http响应回到JavaScript和在那里处理这个响应。

如果我发送一个头重定向然后一个http响应代码,那么当正常执行控制器时,头重定向会被跳过。

如果我发送响应代码,然后标题重定向,那么JavaScript会尝试将XHR传递给我的/ auth控制器。

我的问题是我该如何区分XHR请求和标准执行还是更好呢,请妥善处理?

回答

1

默认情况下,无法区分差异。

通常,您会为请求添加额外的标头。最可靠的方法是使用Accept标题。

例如

xhr.setRequestHeader("Accept", "application/json"); 

...说你更喜欢JSON作为响应格式。

然后,服务器可以测试JSON是否优先于HTML,然后假定它需要API样式响应(而不是HTML响应)。

甲更少的RESTful更哈克的方法是使用一个完全自定义首部:

xhr.setRequestHeader("x-requested-with", "xmlhttprequest");