5

スナップセッションの使い方の例を探し回っています。今のところ何もありません。誰かが私に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がありません。

4

1 に答える 1

3

このモジュールSnap.extension.sessionを意味しますか?私の知る限り、パッケージは非推奨です。snap-auth

snapletとして実装された新しいセッション APIを使用できます。

セッションおよび認証スナップレットを使用するようにアプリケーションをセットアップする方法のを確認してください。次に、セッションにデータを保存できます。

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"

追加した:

サイトキーを含むファイルが自動的に作成されます。関数(ここでinitCookieSessionManager定義) は、パッケージの関数を使用します (ここを参照)。ドキュメントから:getKeyclientsessionIf the file does not exist or is corrupted a random key will be generated and stored in that file.

セッションをコミットしなかったため、ハンドラーは機能しないと思います(commitSession ここを参照)セッションを更新するすべてのハンドラーでコミットするか、自動的に使用wrapHandlersおよび/またはwithSession実行できます。

于 2012-04-03T17:22:23.343 に答える