我有一个项目与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
设置为客户端?
5条答案
按热度按时间0g0grzrc1#
正如注解中提到的,在Filter的before方法中返回Response对象会阻止控制器的执行。您不需要使用
die
或exit
。请注意,使用
return;
不返回任何内容不会使控制器停止运行。ckocjqey2#
使用sendBody方法打印响应内容。
ev7lccsx3#
$response
在before方法中不可用:因此,我在before方法中执行了以下操作,以发送响应并停止执行:mhd8tkvw4#
这是延迟的,但是返回响应将阻止控制器的执行。
我在获取axios响应拦截器的
error.response
对象时在前端遇到了一个问题,通过添加下面的头文件解决了这个问题。e0uiprwp5#
今天我亲身经历了这个过滤问题。我的情况如下(摘自
App\Config\Filters
):$globals
- CSRF和滤波器A过滤器A的返回方式与@ViLar建议的方式相同。
$filters
-过滤器B筛选器B是一个通用筛选器,如果出现故障,则会重定向。
问题是,在我的示例中,我希望Filter B仍然运行,但当Filter A返回响应时- Codeigniter停止处理。事实上,我希望Filter B实际上优先于Filter A。Codeigniter编译要应用的Filter列表,但首先选择 global,然后选择 filters 数组。
我的解决方案(我希望这对类似情况下的任何人都有帮助)是编辑
System/Filters/Filters.php
(是的,这是一个核心系统文件,有些人可能不喜欢)和initialize()
函数,并将$this->processFilters($uri);
移到$this->processGlobals($uri);
调用之上。