我有以下方法
private function adminRequired($accessControl)
{
$user = new \CloseCall\ValueObject\User(2);
if(!$accessControl->isAdmin($user)) {
header("location: /auth");
http_response_code(401);
}
}
在我的控制器中,此方法始终在构建控制器时运行,以检查用户是否具有管理员权限。
我遇到的问题是XHR请求也可以发送到此控制器而header
重定向不适合这种情况,在这种情况下我想发回401 http响应javascript并在那里处理这个响应。
如果我发送标题重定向然后是http响应代码,那么在正常执行控制器时会跳过标题重定向。
如果我发送响应代码然后重定向标题,那么javascript会尝试XHR到我的/ auth控制器。
我的问题是如何区分XHR请求和标准执行还是更好,然后优雅地处理它?
答案 0 :(得分:1)
默认情况下,没有办法区分。
通常,您会在请求中添加额外的标头。最RESTful的方法是使用Accept
标题。
e.g。
xhr.setRequestHeader("Accept", "application/json");
...说你更喜欢JSON作为响应格式。
然后,服务器可以测试JSON是否优先于HTML,然后假设它需要API样式响应(而不是HTML响应)。
使用完全自定义标头的一种不那么RESTful和更多hacky方法:
xhr.setRequestHeader("x-requested-with", "xmlhttprequest");