f# - 从会话状态中删除密钥
问题描述
(请注意,我在 Suave 和后端 Web 开发方面的总体经验通常可以用天来衡量,并且一方面可以计算)
作为我项目的一部分,每当用户成功登录时,都会创建一个唯一的 GUID 并将其存储在会话状态中(使用SessionID
密钥)。来自同一用户的后续请求传入同一 GUID(来自会话状态),在该 GUID 中从服务器内存中保存的映射中查找它以确认权限。
这部分使用 Suave文档中的方法完美地工作。为了澄清,我的路由路径与文档中定义的statefulForSession
一起使用setSessionValue
,以设置和读取上面提到的密钥。getSessionValue
SessionID
当用户注销或在一段时间内没有任何活动时,GUID 将从上面的服务器持有的地图中删除。是否可以从会话状态中删除密钥 ( )?SessionID
即...是否有可能的定义 a removeSessionValue
?
鉴于底层StateStore
对象只暴露set
and get
,这让我想知道我所问的是否(有点)没有意义,或者是否还有其他一些我应该使用的机制。
从 Suave 源代码中,我知道会话状态(保存在字符串 -> 对象映射中)最终在名为st
.
2021 年 11 月 8 日更新:
此后,在对象公开方法的地方提交了拉取请求。unset
StateStore
解决方案
您所要求的似乎是合理的,但鉴于当前的StateStore
API,我认为没有一种干净的方法可以做到这一点。也就是说,您可以按如下方式破解低级 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 源代码中复制了大部分内容并快速尝试以确保它可以正常工作,但我不能保证它的正确性。
推荐阅读
- javascript - 如何设置输入限制?
- c# - Unity3d - 更改天空盒颜色时反射不会更新
- perforce - perforce:如何检查最近(半年期间)修改的文件以及修改这些文件的人
- haskell - 如何返回在 Haskell 编程中交替组合两个函数列表产生的函数?
- android - 我可以在执行航点任务时向任何方向旋转飞机偏航吗?
- python - Django中多对多字段的PATCH
- ios - 使用 Socket 从浏览器读取请求后如何发送响应?(我正在使用 SwiftSocket)
- python - 我怎样才能让这段代码不仅仅包含循环中的第一次出现?
- c - 我的平衡支架解决方案有什么问题?
- android - 为什么广播接收器不能在服务内部连续工作