繁体   English   中英

是否可以在vibe.d中全局存储当前会话信息? (dlang)

[英]Is it possible to store current session information globally in vibe.d? (dlang)

该站点的示例:

import vibe.d;

void login(HTTPServerRequest req, HTTPServerResponse res)
{
    enforceHTTP("username" in req.form && "password" in req.form,
        HTTPStatus.badRequest, "Missing username/password field.");

    // todo: verify user/password here

    auto session = res.startSession();
    session["username"] = req.form["username"];
    session["password"] = req.form["password"];
    res.redirect("/home");
}

void logout(HTTPServerRequest req, HTTPServerResponse res)
{
    res.terminateSession();
    res.redirect("/");
}

void checkLogin(HTTPServerRequest req, HTTPServerResponse res)
{
    // force a redirect to / for unauthenticated users
    if( req.session is null )
        res.redirect("/");
}

shared static this()
{
    auto router = new URLRouter;
    router.get("/", staticTemplate!"index.dl");
    router.post("/login", &login);
    router.post("/logout", &logout);
    // restrict all following routes to authenticated users:
    router.any("*", &checkLogin);
    router.get("/home", staticTemplate!"home.dl");

    auto settings = new HTTPServerSettings;
    settings.sessionStore = new MemorySessionStore;
    // ...
}

但是可以说我不想在整个程序中将ServerResponse传递给每个函数。 例如,如果res.session正在存储当前用户的ID,该怎么办。 这是经常使用的,所以我不希望这通过每个函数传递。 如何在全球范围内存储此会话信息? 假设有多个用户正在使用该网站。

这是可能的,尽管有些气disc。

您不能简单地将其全局存储,因为没有“全局”会话之类的东西-它始终特定于请求上下文。 即使默认情况下在D中具有全局线程局部变量也无济于事,因为多个光纤共享同一执行线程。

对于此类任务,vibe.d提供了TaskLocal模板,该模板可完全执行您想要的操作。 我还没有尝试过,但是希望TaskLocal!Session session能够“正常工作”。

请注意文档中的以下两个警告:

但是请注意,每个TaskLocal变量都会增加使用任务本地存储的任何任务的内存占用。 访问TaskLocal变量的开销也比线程局部变量的开销高,但是通常仍然为O(1)

必须将FiberLocal实例声明为静态/全局线程局部变量。 将它们定义为临时/堆栈变量将导致崩溃或数据损坏!

异议

但是,根据我的经验,尽管打字带来一些不便,但最好还是将所有此类上下文显式传递出去。 出于某种原因,不建议使用全局变量-随着程序大小的增加,不可避免地将很难跟踪模块之间的依赖关系并测试此类代码。 现在陷入便利诱惑可能会在以后引起很多头痛。 为了最大程度地减少额外的输入并简化代码维护,我可能建议改为定义struct Context { ...} ,该struct Context { ...}将包含请求/会话指针,并且将按常规传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM