golangの軽量・高速なWebフレームワークでechoと言うものがあります。
そこでmysqlを使ったセッション管理を実装したのでメモ
環境
- Go1.9
- echo 3.2.3
- srinathgs/mysqlstore
- Mysql5.7.20
やること
公式サイトのガイドを見ると、echoではgorillaのセッション管理機能を使用することを推奨しているようです。
それを使用することでgorillaコミュニティで開発されたセッションストアを流用することができるからですね。
必要なパッケージをインストールします。
go get github.com/srinathgs/mysqlstore
go get github.com/labstack/echo-contrib/session
以下のようにコードを追加します。
package main
import (
"net/http"
"github.com/labstack/echo"
"github.com/labstack/echo-contrib/session"
"github.com/srinathgs/mysqlstore"
)
func main() {
e := echo.New()
store, err := mysqlstore.NewMySQLStore("<user>:<pass>@<host>:<port>/<db>?parseTime=true&loc=local", "sessions", "/", 60*60*24*14)
if err != nil {
panic(err)
}
e.Use(session.Middleware(store))
e.Logger.Fatal(e.Start(":9000"))
}
mysqlstore.NewMySQLStore
の第二引数はセッション情報を保存するテーブルの名前、第三引数はクッキーで指定されるPath、第四引数はクッキーのmaxAgeとなります。
xormやgormなどですでにDBとの接続を確立している場合はmysqlstore.NewMySQLStoreFromConnection
を使うこともできます。
var engine *xorm.Engine
store, err := mysqlstore.NewMySQLStoreFromConnection(engine.DB().DB, "sessions", "/", 60*60*24*14)
注意する点
ここを書きたいために記事を書いたくらいなのですが、mysqlのエンドポイントを指定する箇所でオプションとしてparseTime=true
を指定しないと正常に動作しません。
さらに、エラーなども全く出ないまま動かないためこれでだいぶ時間を溶かしてしまいました。
issueは立てられているようです。
ハンドラでセッション情報を使用する
アクセスされる度にカウントを増やしてみます
type Count struct {
count int
}
func Handler(c echo.Context) error {
sess, err := session.Get("sessions", c)
if err != nil {
c.Error(err)
return err
}
if sess.Values["count"] == nil {
sess.Values["count"] = 0
}
count := sess.Values["count"].(int)
count++
sess.Values["count"] = count
sess.Save(c.Request(), c.Response())
c.JSON(http.StatusOK, Count{count})
return nil
}