【问题标题】:Cannot set expire in private cookie Rocket-Rust无法在私有 cookie Rocket-Rust 中设置过期时间
【发布时间】:2022-01-19 13:50:20
【问题描述】:

我正在尝试使用 rocket::http::Cookie 在 Rust(Rocket Framework 版本 0.5.0-rc.1)中的私有 Cookie 中设置过期时间。

在我读到的 Rocket add_private 文档中:

除非为给定属性设置了值,否则在添加到 self 之前会在 cookie 上设置以下默认值:

path: "/"
SameSite: Strict
HttpOnly: true
Expires: 1 week from now

我不明白如何设置 Expires 属性。

我尝试使用 .set_expires() 创建一个新的 cookie 并设置过期时间(如 doc example 中所示),但它给了我错误:“特征 From<OffsetDateTime> 未针对 std::option::Option<time::offset_date_time::OffsetDateTime> 实现”。返回错误的代码类似于(此处的值仅用于测试目的):

use rocket::http::{Cookie, CookieJar};
use cookie::time::{Duration, OffsetDateTime};

fn handler(jar: &CookieJar<'_>) {
    let mut cookie = Cookie::new("name", "value");

    let mut now = OffsetDateTime::now_utc();
    now += Duration::days(1);
    cookie.set_expires(now);

    jar.add_private(cookie);
}

我想知道我是否必须使用 cookie crate 而不是 Rocket::http 来创建 cookie,但在这种情况下,我不能在响应处理程序中使用 CookieJar,因为它需要一个 Rocket::http::Cookie 而不是 cookie ::Cookie。

有没有其他方法可以使用 Rocket http 模块在私有 cookie 中设置过期时间或最长期限?

【问题讨论】:

    标签: cookies rust rust-rocket


    【解决方案1】:

    我遇到了同样的问题,我想我已经解决了:

    • Rocket 在内部同时使用 cookietime
    • Rocket 文档中rocket::http::Cookie 的示例代码实际上来自cookie 包,因此容易混淆地使用use cookies::Cookie; 而不是use rocket::http::Cookie
    • 关键:https://api.rocket.rs/v0.5-rc/ 上的文档似乎比 crates.io 中的代码更新,并且使用不同版本的 cookietime crates。

    因此,您需要使用 Rocket 正在使用的相同版本或 cookietime。如果您使用 crates.io 的 Rocket 0.5.0-rc.1,那么您需要 cookie 0.15 或 time 0.2.11。

    我能够让我的代码在我的Cargo.toml 中使用这些行:

    rocket = { version = "0.5.0-rc.1", features = ["secrets", "json"] }
    time = "0.2.11"
    

    您的示例代码将变为:

    use rocket::http::{Cookie, CookieJar};
    use time::{Duration, OffsetDateTime};
    
    fn handler(jar: &CookieJar<'_>) {
        let mut cookie = Cookie::new("name", "value");
    
        let mut now = OffsetDateTime::now_utc();
        now += Duration::days(1);
        cookie.set_expires(now);
    
        jar.add_private(cookie);
    }
    

    另外,我认为如果您使用 cookie 的 0.15 版(您可能使用的是 0.16.0-rc.1),那么您的代码应该可以正常工作。我认为直接从time 包中导入DurationOffsetTime 会更干净。

    看起来,Github 中最新版本的 Rocket 将 time 公开为 rocket::time,所以我们应该能够在最终 0.5 版本发布时切换到该版本。

    【讨论】:

    • 太好了,谢谢!使用来自time 0.2.11 的DurationOffsetTime 使代码有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多