簡體   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