LoginSignup
1
2

More than 5 years have passed since last update.

Go - irisとgorilla/sessionsでセッション管理してみる

Posted at

irisについてるセッション管理ライブラリを使うと、どうもロック関連がおかしくて途中で止まってしまうので、gorilla/sessionを使ってみる。

カウンターつくってみた。/upにアクセスすると1アップして、/clにアクセスするとクリアされる。

コード

main.go
package main

import (
    "github.com/kataras/iris"
    "github.com/kataras/iris/context"
    "github.com/gorilla/sessions"
    "fmt"
)

var store = sessions.NewCookieStore([]byte("hoge"))
var sess_name = "sess"

func main() {
    app := iris.New()
    app.Get("/", topPage)
    app.Get("up", upPage)
    app.Get("cl", clearPage)
    app.Run(iris.Addr(":8080"))
}

func topPage (ctx context.Context) {
    f := getFlash(ctx)
    cnt := fmt.Sprintf(
        "<h2>count is %d</h2>",
        getCount(ctx),
    )
    html := `<br><a href="/up">Count Up</a>
    <br><a href="/cl">Count Clear</a>`
    ctx.HTML(f + cnt + html)
}

func upPage (ctx context.Context) {
    countUp(ctx)
    addFlash(ctx, "count up")
    ctx.Redirect("/")
}

func clearPage (ctx context.Context) {
    sessClear(ctx)
    addFlash(ctx,"session clear")
    ctx.Redirect("/")
}
session.go
package main

import (
    "github.com/kataras/iris/context"
    "fmt"
)

func getCount(ctx context.Context) int {
    sess, _ := store.Get(ctx.Request(), sess_name)
    cnt := 0
    if v, ok := sess.Values["cnt"]; ok {
        if c, ok := v.(int); ok {
            cnt = c
        }
    }
    return cnt
}

func countUp(ctx context.Context) {
    sess, _ := store.Get(ctx.Request(), sess_name)
    cnt := 1
    if v, ok := sess.Values["cnt"]; ok {
        if c, ok := v.(int); ok {
            cnt = c + 1
        }
    }
    sess.Values["cnt"] = cnt
    sess.Save(ctx.Request(), ctx.ResponseWriter())
}

func sessClear(ctx context.Context) {
    sess, _ := store.Get(ctx.Request(), sess_name)
    sess.Values = make(map[interface{}]interface{})
    sess.Save(ctx.Request(), ctx.ResponseWriter())
}

func getFlash(ctx context.Context) string {
    sess, _ := store.Get(ctx.Request(), sess_name)
    f := sess.Flashes()
    sess.Save(ctx.Request(), ctx.ResponseWriter())
    if len(f) > 0 {
        return fmt.Sprintf(
            `<p style="color:#090;padding:5px;">%s</p>`,
            f[0],
        )
    }
    return ""
}

func addFlash(ctx context.Context, msg string) {
    sess, _ := store.Get(ctx.Request(), sess_name)
    sess.AddFlash(msg)
    sess.Save(ctx.Request(), ctx.ResponseWriter())
}

画面

session.png

1
2
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
1
2