رفتن به محتوا

مدیریت نشست

نشست‌ها به شما اجازه می‌دهند داده‌های خاص کاربر را در چندین درخواست HTTP ذخیره کنید. از آنجا که HTTP بدون حالت است، نشست‌ها از کوکی‌ها یا مکانیزم‌های دیگر برای شناسایی کاربران بازگشتی و بازیابی داده‌های ذخیره شده آن‌ها استفاده می‌کنند.

استفاده از gin-contrib/sessions

میان‌افزار gin-contrib/sessions مدیریت نشست با پشتیبان‌های ذخیره‌سازی متعدد ارائه می‌دهد:

Terminal window
go get github.com/gin-contrib/sessions

نشست‌های مبتنی بر کوکی

ساده‌ترین رویکرد داده‌های نشست را در کوکی‌های رمزنگاری شده ذخیره می‌کند:

package main
import (
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// Create cookie-based session store with a secret key
store := cookie.NewStore([]byte("your-secret-key"))
r.Use(sessions.Sessions("mysession", store))
r.GET("/login", func(c *gin.Context) {
session := sessions.Default(c)
session.Set("user", "john")
session.Save()
c.JSON(http.StatusOK, gin.H{"message": "logged in"})
})
r.GET("/profile", func(c *gin.Context) {
session := sessions.Default(c)
user := session.Get("user")
if user == nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "not logged in"})
return
}
c.JSON(http.StatusOK, gin.H{"user": user})
})
r.GET("/logout", func(c *gin.Context) {
session := sessions.Default(c)
session.Clear()
session.Save()
c.JSON(http.StatusOK, gin.H{"message": "logged out"})
})
r.Run(":8080")
}

نشست‌های مبتنی بر Redis

برای برنامه‌های تولیدی، نشست‌ها را در Redis برای مقیاس‌پذیری در چندین نمونه ذخیره کنید:

package main
import (
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/redis"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// Connect to Redis for session storage
store, err := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
if err != nil {
panic(err)
}
r.Use(sessions.Sessions("mysession", store))
r.GET("/set", func(c *gin.Context) {
session := sessions.Default(c)
session.Set("count", 1)
session.Save()
c.JSON(http.StatusOK, gin.H{"count": 1})
})
r.GET("/get", func(c *gin.Context) {
session := sessions.Default(c)
count := session.Get("count")
c.JSON(http.StatusOK, gin.H{"count": count})
})
r.Run(":8080")
}

گزینه‌های نشست

رفتار نشست را با sessions.Options پیکربندی کنید:

session := sessions.Default(c)
session.Options(sessions.Options{
Path: "/",
MaxAge: 3600, // Session expires in 1 hour (seconds)
HttpOnly: true, // Prevent JavaScript access
Secure: true, // Only send over HTTPS
SameSite: http.SameSiteLaxMode,
})
گزینهتوضیحات
Pathمحدوده مسیر کوکی (پیش‌فرض: /)
MaxAgeطول عمر به ثانیه. از -1 برای حذف، 0 برای نشست مرورگر استفاده کنید
HttpOnlyدسترسی JavaScript به کوکی را ممنوع می‌کند
Secureفقط کوکی را از طریق HTTPS ارسال می‌کند
SameSiteرفتار کوکی بین‌سایتی را کنترل می‌کند (Lax، Strict، None)

پشتیبان‌های موجود

پشتیبانپکیجمورد استفاده
Cookiesessions/cookieبرنامه‌های ساده، داده‌های نشست کم
Redissessions/redisتولید، استقرارهای چند نمونه‌ای
Memcachedsessions/memcachedلایه کش با عملکرد بالا
MongoDBsessions/mongoوقتی MongoDB ذخیره‌سازی اصلی شماست
PostgreSQLsessions/postgresوقتی PostgreSQL ذخیره‌سازی اصلی شماست

نشست‌ها در مقابل JWT

جنبهنشست‌هاJWT
ذخیره‌سازیسمت سرور (Redis، DB)سمت کلاینت (توکن)
لغوآسان (حذف از store)دشوار (نیاز به لیست سیاه)
مقیاس‌پذیرینیاز به store مشترکبدون حالت
حجم دادهنامحدود سمت سرورمحدود به حجم توکن

از نشست‌ها زمانی استفاده کنید که نیاز به لغو آسان دارید (مثلاً خروج، مسدود کردن کاربر). از JWT زمانی استفاده کنید که نیاز به احراز هویت بدون حالت در میکروسرویس‌ها دارید.

همچنین ببینید