【问题标题】:CodeIgniter 4 Filter - exit with responseCodeIgniter 4 过滤器 - 退出并响应
【发布时间】:2020-12-01 04:22:22
【问题描述】:

我有一个使用 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 设置为客户端?

【问题讨论】:

  • $response 设置为客户端是什么意思?如果你想返回一个 HTTP 401 和你刚刚设置的标题和正文,你只需要添加 return $response; 而不是 exit;
  • 哦,我想如果我在before 中返回一些东西,它仍然会从与路径关联的控制器执行方法。但实际上不是。谢谢。

标签: php codeigniter codeigniter-4


【解决方案1】:

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

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

【讨论】:

  • $response 可通过 before 方法中的服务获得。 @KunLun 代码对于这部分是正确的。
【解决方案2】:

正如评论中提到的,在 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; 不返回任何内容不会阻止控制器运行。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多