无法在私有 cookie Rocket-Rust 中设置过期
Cannot set expire in private cookie Rocket-Rust
我正在尝试使用 rocket::http::Cookie
.
在 Rust(Rocket Framework 版本 0.5.0-rc.1)中的私有 Cookie 中设置过期
在 rocket add_private 文档中我读到:
Unless a value is set for the given property, the following defaults are set on cookie before being added to self:
path: "/"
SameSite: Strict
HttpOnly: true
Expires: 1 week from now
我不明白如何设置 Expires 属性。
我尝试创建一个新的 cookie 并使用 .set_expires() 设置过期(如文档 example 中所示),但它给了我错误:“特征 From<OffsetDateTime>
std::option::Option<time::offset_date_time::OffsetDateTime>
未实施”。 return 错误的代码类似于(此处的值仅用于测试目的):
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 中设置过期或最长期限?
我遇到了同样的问题,我想我已经解决了:
- Rocket 在内部同时使用
cookie
和 time
包
rocket::http::Cookie
的 Rocket 文档中的示例代码实际上来自 cookie
包,因此容易混淆地使用 use cookies::Cookie;
而不是 use rocket::http::Cookie
。
- 关键点: https://api.rocket.rs/v0.5-rc/ 中的文档似乎比 crates.io 中的代码更新,并且使用了 [=12] 的不同版本=] 和
time
个板条箱。
因此您需要使用与 Rocket 相同的版本或 cookie
或 time
。如果你使用 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
包导入 Duration
和 OffsetTime
更干净。
看起来 Github 中的最新版本的 Rocket 将 time
公开为 rocket::time
,因此我们应该能够在最终 0.5 版本发布时切换到该版本。
我正在尝试使用 rocket::http::Cookie
.
在 rocket add_private 文档中我读到:
Unless a value is set for the given property, the following defaults are set on cookie before being added to self:
path: "/" SameSite: Strict HttpOnly: true Expires: 1 week from now
我不明白如何设置 Expires 属性。
我尝试创建一个新的 cookie 并使用 .set_expires() 设置过期(如文档 example 中所示),但它给了我错误:“特征 From<OffsetDateTime>
std::option::Option<time::offset_date_time::OffsetDateTime>
未实施”。 return 错误的代码类似于(此处的值仅用于测试目的):
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 中设置过期或最长期限?
我遇到了同样的问题,我想我已经解决了:
- Rocket 在内部同时使用
cookie
和time
包 rocket::http::Cookie
的 Rocket 文档中的示例代码实际上来自cookie
包,因此容易混淆地使用use cookies::Cookie;
而不是use rocket::http::Cookie
。- 关键点: https://api.rocket.rs/v0.5-rc/ 中的文档似乎比 crates.io 中的代码更新,并且使用了 [=12] 的不同版本=] 和
time
个板条箱。
因此您需要使用与 Rocket 相同的版本或 cookie
或 time
。如果你使用 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
包导入 Duration
和 OffsetTime
更干净。
看起来 Github 中的最新版本的 Rocket 将 time
公开为 rocket::time
,因此我们应该能够在最终 0.5 版本发布时切换到该版本。