package
0.0.1
Repository: https://github.com/gokit/echox.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

sessions

Go Report Card GoDoc

Echo middleware for session management with multi-backend support:

Usage

Start using it

Download and install it:

$ go get github.com/gokit/echox/sessions

Import it in your code:

import "github.com/gokit/echox/sessions"

Basic Examples

single session

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/cookie"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store := cookie.NewStore([]byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/hello", func(c echo.Context) error {
		session := sessions.Default(c)

		if session.Get("hello") != "world" {
			session.Set("hello", "world")
			session.Save()
		}

		c.JSON(200, echo.Map{"hello": session.Get("hello")})

        return nil
	})
	r.Start(":8000")
}

multiple sessions

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/cookie"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store := cookie.NewStore([]byte("secret"))
	sessionNames := []string{"a", "b"}
	r.Use(sessions.SessionsMany(sessionNames, store))

	r.GET("/hello", func(c echo.Context) error {
		sessionA := sessions.DefaultMany(c, "a")
		sessionB := sessions.DefaultMany(c, "b")

		if sessionA.Get("hello") != "world!" {
			sessionA.Set("hello", "world!")
			sessionA.Save()
		}

		if sessionB.Get("hello") != "world?" {
			sessionB.Set("hello", "world?")
			sessionB.Save()
		}

		c.JSON(200, echo.Map{
			"a": sessionA.Get("hello"),
			"b": sessionB.Get("hello"),
		})
        
        return nil
	})
	r.Start(":8000")
}

Backend examples

cookie-based

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/cookie"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store := cookie.NewStore([]byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}

filesystem

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/filesystem"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store := filesystem.NewStore("/path/to/sessions/", []byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}

Redis

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/redis"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}

Memcached

ASCII Protocol

package main

import (
	"github.com/bradfitz/gomemcache/memcache"
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/memcached"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store := memcached.NewStore(memcache.New("localhost:11211"), "", []byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}

Binary protocol (with optional SASL authentication)

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/memcached"
	"github.com/labstack/echo/v4"
	"github.com/memcachier/mc"
)

func main() {
	r := echo.New()
	client := mc.NewMC("localhost:11211", "username", "password")
	store := memcached.NewMemcacheStore(client, "", []byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}

MongoDB

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/mongo"
	"github.com/labstack/echo/v4"
	"github.com/globalsign/mgo"
)

func main() {
	r := echo.New()
	session, err := mgo.Dial("localhost:27017/test")
	if err != nil {
		// handle err
	}

	c := session.DB("").C("sessions")
	store := mongo.NewStore(c, 3600, true, []byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}

memstore

package main

import (
	"github.com/gokit/echox/sessions"
	"github.com/gokit/echox/sessions/memstore"
	"github.com/labstack/echo/v4"
)

func main() {
	r := echo.New()
	store := memstore.NewStore([]byte("secret"))
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/incr", func(c echo.Context) error {
		session := sessions.Default(c)
		var count int
		v := session.Get("count")
		if v == nil {
			count = 0
		} else {
			count = v.(int)
			count++
		}
		session.Set("count", count)
		session.Save()
		c.JSON(200, echo.Map{"count": count})
        return nil
	})
	r.Start(":8000")
}