Go 言語 (Golang) は初めてで、Web ベースのアプリケーションを作成しています。PHP のようなセッション変数 (あるページから次のページに使用でき、ユーザー セッションに固有の変数) を使用したいと思います。Goにそのようなものはありますか?そうでない場合、どうすれば自分で実装できますか? または、どのような代替方法がありますか?
3 に答える
あなたはおそらくゴリラを見たいと思うでしょう。ここに記載されているように、セッションサポートがあります。
それ以外、またはおそらく他のWebツールキットの1つを使用するには、自分で作成する必要があります。
考えられる解決策は次のとおりです。
- セッション変数をメモリに格納するためのユーザーセッションごとのゴルーチン。
- 変数をセッションCookieに保存します。
- データベースを使用してユーザーセッションデータを保存します。
それぞれの実装の詳細は読者にお任せします。
完全な Web ツールキットを使用せずにセッション サポートのみが必要な場合の代替手段を次に示します。
ここに別の選択肢があります(開示:私は著者です):
https://github.com/icza/session
そのドキュメントから引用:
このパッケージは、使いやすく、拡張可能で安全なセッションの実装と管理を提供します。パッケージのドキュメントは godoc.org で見つけることができます:
https://godoc.org/github.com/icza/session
これは「単なる」HTTP セッションの実装と管理であり、そのまま使用することも、既存の Go Web ツールキットおよびフレームワークと一緒に使用することもできます。
概要
パッケージには 3 つの主なプレーヤーがあります。
Session
(HTTP) セッション インターフェイスです。それを使用して、そこから定数および変数属性を保存および取得できます。Store
セッションを保存し、サーバー側で ID によって取得できるようにするセッション ストア インターフェイスです。Manager
Session
は、(着信) HTTP 要求からを取得Session
し、HTTP 応答に を追加してクライアントにセッションについて知らせる役割を担うセッション マネージャ インターフェイスです。Aには、サーバー側で値を管理する責任Manager
があるバッキングがあります。Store
Session
このパッケージのプレーヤーはインターフェイスによって表され、これらすべてのプレーヤーに対してさまざまな実装が提供されます。提供された実装に拘束されることはありません。任意のプレーヤーに独自の実装を自由に提供してください。
使用法
使い方はこれ以上簡単ではありません。http.Requestに関連付けられた現在のセッションを取得するには:
sess := session.Get(r)
if sess == nil {
// No session (yet)
} else {
// We have a session, use it
}
新しいセッションを作成するには (ログイン成功時など)、それをhttp.ResponseWriterに追加します(クライアントにセッションについて知らせるため):
sess := session.NewSession()
session.Add(sess, w)
より高度なセッションの作成を見てみましょう: 一定の属性 (セッションの存続期間) と初期の可変属性を提供しましょう:
sess := session.NewSessionOptions(&session.SessOptions{
CAttrs: map[string]interface{}{"UserName": userName},
Attrs: map[string]interface{}{"Count": 1},
})
これらの属性にアクセスして値を変更するには"Count"
:
userName := sess.CAttr("UserName")
count := sess.Attr("Count").(int) // Type assertion, you might wanna check if it succeeds
sess.SetAttr("Count", count+1) // Increment count
(もちろんSession.SetAttr()
、セッションの作成時だけでなく、後で変数属性を追加することもできます。)
セッションを削除するには (ログアウト時など):
session.Remove(sess, w)
これらすべての動作を示すセッション デモ アプリケーションをチェックしてください。
Google App Engine のサポート
このパッケージは、Google App Engine (GAE) プラットフォームのサポートを提供します。
ドキュメントには含まれていませんが (+build appengine
ビルドの制約により)、ここにあります: gae_memcache_store.go
この実装では、セッションを Memcache に保存し、Memcache からデータが削除された場合に備えて、バックアップとしてセッションをデータストアに保存します。この動作はオプションです。データストアは完全に無効にすることができます。また、Datastore への保存を同期的に (同じゴルーチンで) 実行するか、非同期で (別のゴルーチンで) 実行するかを選択できるため、応答時間が短縮されます。
NewMemcacheStore()
関数と関数を使用NewMemcacheStoreOptions()
して、セッションを GAE の Memcache に格納するセッション ストアの実装を作成できます。Memcache へのアクセスは にバインドされた Appengine Context に依存するためhttp.Request
、返された Store はリクエストの存続期間中のみ使用できることに注意してください。ストアが閉じられると、ストアからアクセスされたセッションが自動的に「フラッシュ」されることに注意してください。そのため、要求の最後にストアを閉じることが非常に重要です。これは通常、ストアを渡したセッション マネージャーを閉じることによって行われます (できれば defer ステートメントを使用して)。
そのため、リクエストを処理するたびに、新しい Store を使用して新しいセッション マネージャーを作成する必要があります。セッション マネージャーを使用して、次のようなセッション関連のタスクを実行できます。
ctx := appengine.NewContext(r)
sessmgr := session.NewCookieManager(session.NewMemcacheStore(ctx))
defer sessmgr.Close() // This will ensure changes made to the session are auto-saved
// in Memcache (and optionally in the Datastore).
sess := sessmgr.Get(r) // Get current session
if sess != nil {
// Session exists, do something with it.
ctx.Infof("Count: %v", sess.Attr("Count"))
} else {
// No session yet, let's create one and add it:
sess = session.NewSession()
sess.SetAttr("Count", 1)
sessmgr.Add(sess, w)
}
期限切れのセッションは、データストアから自動的に削除されません。期限切れのセッションを削除するために、パッケージはPurgeExpiredSessFromDSFunc()
を返す関数を提供しますhttp.HandlerFunc
。返されたハンドラー関数をパスに登録することをお勧めします。このパスは、定期的に、たとえば 30 分ごと (任意) に呼び出される cron ジョブとして定義できます。cron ハンドラーは最大 10 分間実行される可能性があるため、返されたハンドラーは 8 分で停止し、期限切れで削除されていないセッションがさらにある場合でも安全に完了します。次のように登録できます。
http.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))
使用方法を示す GAE セッション デモ アプリケーションをチェックしてください。 デモのcron.yamlファイルは、期限切れのセッションをパージするために cron ジョブを定義する方法を示しています。
実際にこれを使用する方法を示すGAE セッション デモ アプリケーションをチェックしてください。