如何在Phoenix的Plug中终止后续路由?
Phoenix Plug鉴权后终止请求的解决方案
在Phoenix的Plug里,光调用send_resp/3发送403响应还不够,默认情况下后续的Plug和路由逻辑还是会继续执行,这就是你遇到冲突报错的原因。要终止后续流程,必须调用halt/1函数标记连接已处理完成。
修改后的代码如下:
def validate(conn, _opts) do if !Map.has_key?(conn.cookies, "jwt") do conn |> send_resp(403, "Forbidden") |> halt() # 新增halt,阻止后续路由执行 else conn # 验证通过时返回原连接,让流程继续 end end
关键说明
halt/1会把Conn结构体的:halted字段设为true,Phoenix的Plug pipeline检测到这个状态后,就会停止执行后续所有的Plug和路由处理逻辑。- 必须保证Plug函数始终返回一个Conn结构体:不管验证失败还是成功,都要返回处理后的conn,这样才能符合Plug的规范。
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

