Manual de operación de sesión y cookies de Gin Framework en lenguaje Go (10)

En el marco de Gin, utilice ctx.SetCookie()métodos para configurar cookies. El siguiente es un ejemplo de implementación específico:

func setCookie(c *gin.Context) {
    // 设置Cookie的参数和值
    c.SetCookie("my_cookie", "example value", 3600, "/", "localhost", false, true)
    
    // 其他逻辑
}

En este ejemplo, utilizamos c.SetCookie()el método para configurar la cookie. Los parámetros recibidos por el método son los siguientes:

  • El primer parámetro es el nombre de la cookie.
  • El segundo parámetro es el valor de la cookie.
  • El tercer parámetro es el tiempo de caducidad de las cookies en segundos. En este ejemplo, establezca el tiempo de caducidad de las cookies en 3600 segundos (es decir, 1 hora).
  • El cuarto parámetro es la ruta de la cookie y especifica la ruta donde está disponible la cookie. En este ejemplo, lo configuramos en la ruta raíz "/".
  • El quinto parámetro es el dominio de la cookie, especificando el nombre del dominio donde está disponible la cookie. En este ejemplo, lo configuramos en "localhost", lo que significa que solo se puede utilizar en el entorno de prueba local.
  • El sexto parámetro es un valor booleano que indica si se debe utilizar HTTPS para enviar cookies. En este ejemplo lo configuramos como falso.
  • El séptimo parámetro es un valor booleano que indica si el atributo SameSite está habilitado. En este ejemplo lo configuramos como verdadero.

Con esta configuración, la cookie se puede enviar al cliente en la respuesta, y el cliente la almacenará automáticamente y la enviará de regreso al servidor en solicitudes posteriores.

ver plantilla 

Establecer el valor de la cookie en el controlador;


func (con AdminControllers) Views(c *gin.Context) {

	c.SetCookie("username", "王二妹", 3600, "/", "localhost", false, true)

	c.HTML(http.StatusOK, "admin/views/index.html", gin.H{
		"title": "views页面",
	})
}

¿Existe la cookie después del tiempo de vencimiento? 

Respuesta: Cuando llega el tiempo de vencimiento de una cookie, el navegador ya no enviará la cookie al servidor. En otras palabras, el navegador considera que la cookie ha caducado y ya no la transmite.

Aunque el navegador ya no envía una cookie caducada, es posible que la cookie aún exista en el almacenamiento de cookies del cliente. Diferentes navegadores tienen diferentes comportamientos: algunos navegadores eliminarán la cookie inmediatamente después de su vencimiento, mientras que otros retendrán la cookie caducada hasta que se borre el caché del navegador o el usuario la elimine activamente.

En el código del lado del servidor, no se puede inspeccionar directamente el almacén de cookies del cliente. El servidor sólo recibirá cookies válidas enviadas por el navegador (es decir, cookies que no hayan caducado).

Por lo tanto, incluso si se ha alcanzado el tiempo de vencimiento, aún puede recibir la cookie caducada en el lado del servidor hasta que el navegador la elimine.

Para evitar el procesamiento de cookies caducadas, puede comprobar en el lado del servidor si la cookie recibida se encuentra dentro del período de validez. Si ha caducado, no se procesará más.

¿Cómo eliminar los campos configurados por las cookies?

En el marco de Gin, para eliminar una cookie, puede utilizar  c.SetCookie() el método y establecer su tiempo de caducidad en una marca de tiempo del pasado. Esto hará que el navegador marque inmediatamente la cookie como caducada y la elimine.

Aquí hay un ejemplo:

func deleteCookie(c *gin.Context) {
    // 删除名为 "my_cookie" 的 Cookie
    c.SetCookie("my_cookie", "", -1, "/", "localhost", false, true)
    
    // 其他逻辑
}

En este ejemplo, utilizamos  c.SetCookie() el método para eliminar la cookie denominada "my_cookie". Configuramos el tiempo de vencimiento de la cookie  -1para indicar que la cookie ha caducado. Luego configuramos los demás parámetros para que sean los mismos que los de la cookie original, asegurando que el navegador elimine la cookie correcta.

Con esta configuración, el navegador eliminará inmediatamente la cookie denominada "my_cookie" cuando se devuelva la respuesta al cliente.

Cabe señalar que para eliminar correctamente una Cookie, debe asegurarse de que los parámetros en el método SetCookie (como ruta, nombre de dominio, Secure, SameSite) sean completamente consistentes con los parámetros utilizados al configurar la Cookie. Sólo si estos parámetros coinciden exactamente podrá el navegador identificar y eliminar correctamente la cookie.

En resumen, para eliminar una cookie, establezca su tiempo de vencimiento en una marca de tiempo del pasado y  c.SetCookie() use los mismos parámetros en el método que la cookie original. Esto notificará al navegador que elimine la cookie inmediatamente.

package admins

import (
	"fmt"
	"net/http"
	"os"
	"path"
	"project/models"
	"strconv"

	"github.com/gin-gonic/gin"
)

type AdminControllers struct{}

func (con AdminControllers) Index(c *gin.Context) {
	c.String(200, "admin后管项目")
}

func (con AdminControllers) PageIndex(c *gin.Context) {
	c.HTML(200, "admin/login/index.html", gin.H{
		"title": "admin后管项目",
	})
}

func (con AdminControllers) Login(c *gin.Context) {

	username := c.PostForm("username")
	password := c.PostForm("password")

	c.String(200, "用户名:=%v,密码:=%v \n", username, password)

	// c.HTML(200, "admin/views/index.html", gin.H{
	// 	"title": "viewAdmin页面",
	// })

}

func (con AdminControllers) Register(c *gin.Context) {
	c.HTML(200, "admin/register/index.html", gin.H{
		"title": "注册页面",
	})
}


func (con AdminControllers) Views(c *gin.Context) {

	c.SetCookie("username", "王二妹", 3600, "/", "localhost", false, true)
	c.SetCookie("hobby", "玩游戏,看电视", 5, "/", "localhost", false, true)

	// c.String(200, "Views页面")
	c.HTML(http.StatusOK, "admin/views/index.html", gin.H{
		"title": "views页面",
	})
}

func (con AdminControllers) DeteleCookie(c *gin.Context) {
	username, err := c.Cookie("username")
	// 获取名为 "my_cookie" 的 Cookie
	if err == nil {
		// 找到了名为 "my_cookie" 的 Cookie
		// cookie 变量包含了该 Cookie 的值
		fmt.Printf("username==success===%v \n", username)
	} else {
		// 没有找到名为 "my_cookie" 的 Cookie
		c.String(200, "username==error===%v \n", err.Error())
	}

	c.SetCookie("username", "王二妹", -1, "/", "localhost", false, true)

	c.HTML(http.StatusOK, "admin/views/index.html", gin.H{
		"title":    "views-detelecookie-successfuly",
		"username": username,
	})

}

Requiere administrador/vistas/

 

 Salida terminal:

21:2:49 app         | [GIN] 2023/06/30 - 21:02:49 | 200 |      7.0073ms |             ::1 | GET      "/admin/views"
21:2:55 app         | username==success===王二妹
21:2:55 app         | [GIN] 2023/06/30 - 21:02:55 | 200 |      5.0031ms |             ::1 | GET      "/admin/views/delete"
21:6:43 app         | [GIN] 2023/06/30 - 21:06:43 | 200 |      6.0031ms |             ::1 | GET      "/admin/views"
21:8:38 app         | username==success===王二妹
21:8:38 app         | [GIN] 2023/06/30 - 21:08:38 | 200 |      7.0049ms |             ::1 | GET      "/admin/views/delete"

Aquí puedes ampliar sobre el tema del acceso a las cookies con nombres de dominio de segundo nivel;

En el entorno local localhost, vaya al archivo host en C:\Windows\System32\drivers\etc y modifique el archivo de mapeo;

Archivo 127.0.0.1.

Aquí puede ver intuitivamente que después de la modificación, diferentes nombres de dominio de segundo nivel también pueden acceder al valor de la cookie en el mismo host local.

Con respecto al uso de Session, se trata más de introducir paquetes de terceros ( obtenga github.com/gin-contrib/sessions/cookie ).

El paquete correspondiente debe introducirse en el código antes de que el middleware de sesión correspondiente pueda registrarse en el archivo de entrada principal main();

package main


// 引入但三方包 sessions/cookie
// go get github.com/gin-contrib/sessions/cookie

import (
	"project/routers"

	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie" 
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// Create template for router html template
	r.LoadHTMLGlob("*templates/**/**/*")

	// 主入口文件 注册 session 中间件
	store := cookie.NewStore([]byte("secret")) // 设置 Session 密钥
	r.Use(sessions.Sessions("mysession", store))

	r.GET("/", func(ctx *gin.Context) {
		ctx.JSON(200, gin.H{
			"message": "Hello, world!",
		})
	})

	routers.AdminRoutersInit(r)
	routers.DefaultRoutersInit(r)

	r.Run(":8081")

}

Lo anterior es que el registro fue exitoso y el registro fue exitoso en el archivo de entrada principal main.go. Entonces, ¿qué pasa con otras partes del mundo que son ámbito de uso? (Usualmente usado en el controlador correspondiente de la ruta)

Estuche de muestra:

archivo defaultControllers.go

package defaults

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
)

type DefaultControllers struct {
}

func (con DefaultControllers) Index(c *gin.Context) {
	// 创建 session 引擎  传入工作对象
	session := sessions.Default(c)
	// 设置过期时间
	session.Options(sessions.Options{
		MaxAge: 3600 * 6, // 6个小时。基础单位秒
	})

	session.Set("username", "xiaoxiao")
	session.Save()

	c.String(200, "default-index.html")
}

func (con DefaultControllers) Add(c *gin.Context) {
	// 获取 session 值 username

	session := sessions.Default(c)

	username := session.Get("username")

	c.String(200, "default==add.html===%v \n", username)

}

El resultado de salida después de ejecutar el código: establezca el valor de la sesión nombre de usuario al enrutar a /default y establezca el valor de la sesión al enrutar a /default/add ;

 Se puede ver que el valor de la sesión aquí está cifrado, si estamos interesados ​​podemos consultar el paquete de código fuente de las sesiones.

Observación:

1. sesiones.Default(c) Aquí está el objeto que genera un middleware de sesiones

2. Session.Save() debe estar presente en el momento de la configuración; de lo contrario, no tendrá efecto.

Al mismo tiempo, al llamar a sesiones, el espacio de almacenamiento de registro que utilizamos es el contenedor de cookies, también podemos utilizar otros contenedores de espacio de almacenamiento, como redis...

El contenedor Redis también es una buena opción en este caso.

¡Espero que sea útil para tu estudio! 

Supongo que te gusta

Origin blog.csdn.net/A_LWIEUI_Learn/article/details/131483501
Recomendado
Clasificación