![](/style/images/good.png)
9
![](/style/images/bad.png)
GitHub - gin-contrib/sessions: Gin middleware for session management
source link: https://github.com/gin-contrib/sessions
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
sessions
Gin middleware for session management with multi-backend support:
Usage
Start using it
Download and install it:
go get github.com/gin-contrib/sessions
Import it in your code:
import "github.com/gin-contrib/sessions"
Basic Examples
single session
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() store := cookie.NewStore([]byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/hello", func(c *gin.Context) { session := sessions.Default(c) if session.Get("hello") != "world" { session.Set("hello", "world") session.Save() } c.JSON(200, gin.H{"hello": session.Get("hello")}) }) r.Run(":8000") }
multiple sessions
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() store := cookie.NewStore([]byte("secret")) sessionNames := []string{"a", "b"} r.Use(sessions.SessionsMany(sessionNames, store)) r.GET("/hello", func(c *gin.Context) { 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, gin.H{ "a": sessionA.Get("hello"), "b": sessionB.Get("hello"), }) }) r.Run(":8000") }
Backend Examples
cookie-based
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() store := cookie.NewStore([]byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
Redis
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/redis" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
Memcached
ASCII Protocol
package main import ( "github.com/bradfitz/gomemcache/memcache" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/memcached" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() store := memcached.NewStore(memcache.New("localhost:11211"), "", []byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
Binary protocol (with optional SASL authentication)
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/memcached" "github.com/gin-gonic/gin" "github.com/memcachier/mc" ) func main() { r := gin.Default() client := mc.NewMC("localhost:11211", "username", "password") store := memcached.NewMemcacheStore(client, "", []byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
MongoDB
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/mongo/mongomgo" "github.com/gin-gonic/gin" "github.com/globalsign/mgo" ) func main() { r := gin.Default() session, err := mgo.Dial("localhost:27017/test") if err != nil { // handle err } c := session.DB("").C("sessions") store := mongomgo.NewStore(c, 3600, true, []byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
mongo-driver
package main
import (
"context"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/mongo/mongodriver"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
r := gin.Default()
mongoOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.NewClient(mongoOptions)
if err != nil {
// handle err
}
if err := client.Connect(context.Background()); err != nil {
// handle err
}
c := client.Database("test").Collection("sessions")
store := mongodriver.NewStore(c, 3600, true, []byte("secret"))
r.Use(sessions.Sessions("mysession", store))
r.GET("/incr", func(c *gin.Context) {
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, gin.H{"count": count})
})
r.Run(":8000")
}
memstore
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/memstore" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() store := memstore.NewStore([]byte("secret")) r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
package main import ( "github.com/gin-contrib/sessions" gormsessions "github.com/gin-contrib/sessions/gorm" "github.com/gin-gonic/gin" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic(err) } store := gormsessions.NewStore(db, true, []byte("secret")) r := gin.Default() r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
PostgreSQL
package main import ( "database/sql" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/postgres" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() db, err := sql.Open("postgres", "postgresql://username:password@localhost:5432/database") if err != nil { // handle err } store, err := postgres.NewStore(db, []byte("secret")) if err != nil { // handle err } r.Use(sessions.Sessions("mysession", store)) r.GET("/incr", func(c *gin.Context) { 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, gin.H{"count": count}) }) r.Run(":8000") }
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK