Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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
}
trap
東京工業大学で活動するデジタル創作・プログラミング系サークルです。
https://trap.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away