问题描述
我有一个使用CodeIgniter 4的项目。
我有一个before
过滤器:
public function before(RequestInterface $request){
$auth = $request->getHeader("Authorization");
if($auth == null){
$response = Services::response();
$response->setStatusCode(401);
$response->setHeader("WWW-Authenticate","Bearer Token");
$response->setBody("{\"error\": \"unauthorized\"}");
exit;
}
}
如果没有授权,我想停止请求并将$response
返回给客户端。
由于exit
,目前请求已停止。
但是作为答案,我得到了200 OK
而没有body content
。
我如何exit
将该请求$response
设置为客户端?
解决方法
如注释中所述,在Filter的before方法中返回Response对象将阻止控制器的执行。您不需要使用die
或exit
。
public function before(RequestInterface $request){
$auth = $request->getHeader("Authorization");
if($auth == null){
$response = Services::response();
$response->setStatusCode(401);
$response->setHeader("WWW-Authenticate","Bearer Token");
$response->setBody("{\"error\": \"unauthorized\"}");
return $response;
}
}
请注意,使用return;
不返回任何内容不会阻止控制器运行。
使用 sendBody 方法打印响应内容。
public function before(RequestInterface $request){
$auth = $request->getHeader("Authorization");
if($auth == null){
$response = Services::response();
$response->setStatusCode(401);
$response->setHeader("WWW-Authenticate","Bearer Token");
$response->setBody("{\"error\": \"unauthorized\"}");
$response->sendBody();
exit;
}
}
,
$response
在before方法中不可用:
因此,我在before方法中执行了以下操作,以发送响应并停止执行:
header('HTTP/1.1 401 Unauthorized',true,401);
die(json_encode(['error' => 'Unauthorized']));