CodeIgniter 4过滤器-退出并响应

nnt7mjpx  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(255)

我有一个项目与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设置为客户端?

0g0grzrc

0g0grzrc1#

正如注解中提到的,在Filter的before方法中返回Response对象会阻止控制器的执行。您不需要使用dieexit

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;不返回任何内容不会使控制器停止运行。

ckocjqey

ckocjqey2#

使用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;

    }

}
ev7lccsx

ev7lccsx3#

$response在before方法中不可用:因此,我在before方法中执行了以下操作,以发送响应并停止执行:

header('HTTP/1.1 401 Unauthorized', true, 401);
      die(json_encode(['error' => 'Unauthorized']));
mhd8tkvw

mhd8tkvw4#

这是延迟的,但是返回响应将阻止控制器的执行。
我在获取axios响应拦截器的error.response对象时在前端遇到了一个问题,通过添加下面的头文件解决了这个问题。

$response = Service::response()
                   ->setContentType('application/json')
                   ->setHeader('Access-Control-Allow-Origin', 'http:://yourdomain.com');
e0uiprwp

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);调用之上。

相关问题