我一直在谷歌上搜索一下如何使用Snap会话的例子。到目前为止还没有。 有人可以指点我一篇文章或其他一些基于cookie的会话的简单例子吗?
代码片段会非常受欢迎。 类似于在会话中放置用户名并在每次请求之前检查其存在性和有效性。我查看了Snap.extension.session,但我仍然太习惯,无法从库代码中找出如何使用它。
我知道setInSession是将会话值放在cookie中的函数,但我不知道如何从签名中使用它:
setInSession k v = Map.insert k v `liftM` getSession >>= setSession
或如何将整个事物粘在一起。
我不知道是否违反规则要求提供一些示例代码,但如果我能在网上找到任何内容,我就不会这样做。
提前谢谢。
---更新---
我按照下面的示例和链接但事情仍未正确显示。
我只想要一个简单的测试,读取一个键和一个值并将其放入会话cookie然后我想要读回会话值并显示。
所以我初始化了我的会话并将其置于主应用程序状态。
s <- nestSnaplet "" sess $ initCookieSessionManager "config/site_key.txt" "sess" (Just 3600)
第一个困惑是会话初始化扇区需要的关键。 在初始项目设置期间不会创建密钥。
那么我该如何创建呢? 应该在项目文件结构中的关键字在哪里,以便函数可以找到它?
然后是处理程序:
putCookie :: Handler App App ()
putCookie = do
par <- getPostParams
let k = T.decodeUtf8 $ head (par ! (B.pack "key"))
let v = T.decodeUtf8 $ head (par ! (B.pack "value"))
with sess $ setInSession k v
heistLocal (bindString "message" "Cookie inserted!") $ render "reply"
这个只是从Web表单读取密钥和值,它应该将键值对放在cookie中。好吧,显然它没有。
shCookie :: Handler App App ()
shCookie = do
v <- with sess $ getFromSession "key"
heistLocal (bindString "message" (fromMaybe "" v)) $ render "reply"
这个只是回读并显示。我总是得到一个空字符串,这意味着没有这样的东西。
以上任何一种看起来都不正确吗?我在哪里弄错了? 这一切都编译正确,但会话cookie不存在。
答案 0 :(得分:3)
Snap.extension.session
是否意味着this模块? AFAIK {@ 1}}包已弃用。
您可以使用session api实现的新snaplet。
查看example如何设置应用程序以使用session和auth snaplet。然后,您将能够在会话中存储数据:
snap-auth
增加:
将自动创建带有站点密钥的文件。函数data App = App
{ _heist :: Snaplet (Heist App)
, _sess :: Snaplet SessionManager
, _auth :: Snaplet (AuthManager App)
}
makeLens ''App
myHandler :: Handler App App ()
myHandler = do
with sess $ setInSession "key" "value"
(已定义here)使用initCookieSessionManager
包中的getKey
函数(请参阅here)。来自文档:clientsession
我认为你的处理程序不起作用,因为你没有提交会话(参见If the file does not exist or is corrupted a random key will be generated and stored in that file.
here)你可以在每个更新会话的处理程序中提交它,或使用commitSession
和/或wrapHandlers
自动执行此操作。