微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将结构从Actix中间件传递给处理程序?

如何解决如何将结构从Actix中间件传递给处理程序?

我正在尝试为我的Actix应用程序编写身份验证中间件。在中间件中验证请求时,我调用数据库以检索必要的用户数据以验证传入的请求。请求获得授权后,我希望能够将此用户数据传递给处理程序,因为这将使我避免两次查询相同数据。

我找不到解决方案。到目前为止,我能找到的最佳建议是"set a request extension"。似乎没有任何示例,有关此的文档也太少,无法在这里确定要做什么。

解决方法

您可以通过扩展将数据从中间件(服务)传递到处理程序。首先,您必须插入扩展名(在服务中)。 对于 ServiceRequest 结构,实现了 HttpMessage 女巫 extensions_mut() 函数。它必须是可变的,因为您将插入新的扩展名。它可能看起来像这样:

req.extensions_mut().insert(user);

然后你必须为你的数据结构实现 FromRequest trait。

impl FromRequest for User {
    type Error = actix_web::Error;
    type Future = futures::future::Ready<Result<Self,Self::Error>>;
    type Config = ();

    fn from_request(req: &HttpRequest,payload: &mut Payload) -> Self::Future {
        match req.extensions().get::<User>() {
            Some(user) => return ok(user.clone()),None => return err(actix_web::error::ErrorBadRequest("ups..."))
        };
    }

}

然后您就可以在处理程序中使用它了。

pub async fn get_user_handler(user: User) {}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?