7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

echoでmysqlを使ったセッション管理

Last updated at Posted at 2017-12-03

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
}
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?