首页 > 解决方案 > 从会话状态中删除密钥

问题描述

请注意,我在 Suave 和后端 Web 开发方面的总体经验通常可以用天来衡量,并且一方面可以计算

作为我项目的一部分,每当用户成功登录时,都会创建一个唯一的 GUID 并将其存储在会话状态中(使用SessionID密钥)。来自同一用户的后续请求传入同一 GUID(来自会话状态),在该 GUID 中从服务器内存中保存的映射中查找它以确认权限。

这部分使用 Suave文档中的方法完美地工作。为了澄清,我的路由路径与文档中定义的statefulForSession一起使用setSessionValue,以设置和读取上面提到的密钥。getSessionValueSessionID

当用户注销或在一段时间内没有任何活动时,GUID 将从上面的服务器持有的地图中删除。是否可以从会话状态中删除密钥 ( )?SessionID即...是否有可能的定义 a removeSessionValue

鉴于底层StateStore对象只暴露setand get,这让我想知道我所问的是否(有点)没有意义,或者是否还有其他一些我应该使用的机制。

从 Suave 源代码中,我知道会话状态(保存在字符串 -> 对象映射中)最终在名为st.


2021 年 11 月 8 日更新:

此后,在对象公开方法的地方提交了拉取请求。unsetStateStore

标签: f#suave

解决方案


您所要求的似乎是合理的,但鉴于当前的StateStoreAPI,我认为没有一种干净的方法可以做到这一点。也就是说,您可以按如下方式破解低级 cookie 状态:

let removeSessionValue (key : string) : WebPart =
    context (fun ctx ->
        let cookieState =
            {
                serverKey      = ctx.runtime.serverKey
                cookieName     = StateCookie
                userStateKey   = StateStoreType
                relativeExpiry = Session
                secure         = false
            }
        updateCookies cookieState (function
            | None ->
                Map.empty
                    |> ctx.runtime.cookieSerialiser.serialise

            | Some data ->
                try
                    let m = ctx.runtime.cookieSerialiser.deserialise data
                    m
                    |> Map.remove key   // this is where we remove the key
                    |> ctx.runtime.cookieSerialiser.serialise
                with ex ->
                    Map.empty
                    |> ctx.runtime.cookieSerialiser.serialise))

我从Suave 源代码中复制了大部分内容并快速尝试以确保它可以正常工作,但我不能保证它的正确性。


推荐阅读