sesiones pasar paginas manejo entre ejemplos ejemplo control _session session go session-variables

session - pasar - Ir a las variables de sesión?



pasar variables de session entre paginas php (3)

Soy nuevo en el lenguaje Go (Golang) y estoy escribiendo una aplicación basada en la web. Me gustaría usar variables de sesión, como el tipo en PHP (variables que están disponibles de una página a la siguiente y únicas para una sesión de usuario). ¿Hay algo así en Go? Si no, ¿cómo podría implementarlos yo mismo? ¿O qué métodos alternativos hay?


Aquí hay otra alternativa ( revelación: soy el autor ):

https://github.com/icza/session

Citando de su documento:

Este paquete proporciona una implementación y administración de sesión fácil de usar, extensible y segura. Se puede encontrar la documentación del paquete y godoc.org:

https://godoc.org/github.com/icza/session

Esta es "solo" una implementación y administración de una sesión HTTP, puede usarla tal como está, o con cualquier conjunto de herramientas y marcos web Go existentes.

Visión de conjunto

Hay 3 jugadores clave en el paquete:

  • Session es la interfaz de sesión (HTTP). Podemos usarlo para almacenar y recuperar atributos constantes y variables de él.
  • Store es una interfaz de tienda de sesiones que se encarga de almacenar las sesiones y hacerlas recuperables mediante sus ID en el lado del servidor.
  • Manager es una interfaz de administrador de sesiones que es responsable de adquirir una Session de una solicitud HTTP (entrante) y de agregar una Session a una respuesta HTTP para informar al cliente sobre la sesión. Un Manager tiene una Store respaldo que es responsable de administrar los valores de Session en el lado del servidor.

Los jugadores de este paquete están representados por interfaces, y se proporcionan diversas implementaciones para todos estos jugadores. No está obligado por las implementaciones proporcionadas, no dude en proporcionar sus propias implementaciones para cualquiera de los jugadores.

Uso

El uso no puede ser más simple que esto. Para obtener la sesión actual asociada con http.Request :

sess := session.Get(r) if sess == nil { // No session (yet) } else { // We have a session, use it }

Para crear una nueva sesión (por ejemplo, en un inicio de sesión exitoso) y agregarla a http.ResponseWriter (para que el cliente conozca la sesión):

sess := session.NewSession() session.Add(sess, w)

Veamos una creación de sesión más avanzada: proporcionemos un atributo constante (durante la vigencia de la sesión) y un atributo variable inicial:

sess := session.NewSessionOptions(&session.SessOptions{ CAttrs: map[string]interface{}{"UserName": userName}, Attrs: map[string]interface{}{"Count": 1}, })

Y para acceder a estos atributos y cambiar el valor de "Count" :

userName := sess.CAttr("UserName") count := sess.Attr("Count").(int) // Type assertion, you might wanna check if it succeeds sess.SetAttr("Count", count+1) // Increment count

(Por supuesto, los atributos variables también se pueden agregar más adelante con Session.SetAttr() , no solo en la creación de la sesión).

Para eliminar una sesión (por ejemplo, al cerrar la sesión):

session.Remove(sess, w)

Mira la aplicación de demostración de la sesión que muestra todo esto en acción.

Soporte de Google App Engine

El paquete brinda soporte para la plataforma Google App Engine (GAE).

La documentación no lo incluye (debido a la restricción de compilación +build appengine ), pero aquí está: gae_memcache_store.go

La implementación almacena sesiones en Memcache y también guarda sesiones en Datastore como una copia de seguridad en caso de que los datos se eliminen de Memcache. Este comportamiento es opcional, Datastore se puede deshabilitar por completo. También puede elegir si el almacenamiento en Datastore se realiza de forma síncrona (en la misma rutina) o de forma asíncrona (en otra rutina), lo que da como resultado tiempos de respuesta más rápidos.

Podemos usar las NewMemcacheStore() y NewMemcacheStoreOptions() para crear una implementación de la Tienda de sesiones que almacena sesiones en Memcache de GAE. Es importante tener en cuenta que, dado que el acceso a Memcache se basa en el contexto de Appengine, que está vinculado a una http.Request , ¡la tienda devuelta solo puede utilizarse durante la vigencia de una solicitud! Tenga en cuenta que la Tienda "vaciará automáticamente" las sesiones a las que acceda cuando la Tienda esté cerrada, por lo que es muy importante cerrar la Tienda al finalizar su solicitud; esto generalmente se hace cerrando el administrador de sesión al que pasó la tienda (preferiblemente con la declaración de aplazamiento).

Por lo tanto, en cada gestión de solicitudes tenemos que crear un nuevo administrador de sesión utilizando una nueva Tienda, y podemos usar el administrador de sesión para realizar tareas relacionadas con la sesión, algo como esto:

ctx := appengine.NewContext(r) sessmgr := session.NewCookieManager(session.NewMemcacheStore(ctx)) defer sessmgr.Close() // This will ensure changes made to the session are auto-saved // in Memcache (and optionally in the Datastore). sess := sessmgr.Get(r) // Get current session if sess != nil { // Session exists, do something with it. ctx.Infof("Count: %v", sess.Attr("Count")) } else { // No session yet, let''s create one and add it: sess = session.NewSession() sess.SetAttr("Count", 1) sessmgr.Add(sess, w) }

Las sesiones expiradas no se eliminan automáticamente del almacén de datos. Para eliminar sesiones caducadas, el paquete proporciona una función PurgeExpiredSessFromDSFunc() que devuelve un http.HandlerFunc . Se recomienda registrar la función del manejador devuelto en una ruta que luego se puede definir como un trabajo cron para ser llamado periódicamente, por ejemplo, cada 30 minutos más o menos (su elección). Como los manejadores de cron pueden ejecutar hasta 10 minutos, el manejador devuelto se detendrá en 8 minutos para completar con seguridad incluso si hay más sesiones caducadas y sin recuperar. Se puede registrar así:

http.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))

Consulte la aplicación de demostración de la sesión de GAE que muestra cómo se puede usar. cron.yaml archivo cron.yaml de la demostración muestra cómo se puede definir un trabajo cron para depurar las sesiones caducadas.

Consulte la aplicación de demostración de la sesión de GAE que muestra cómo usar esto en acción.



Probablemente quieras echarle un vistazo al gorilla . Tiene soporte de sesión como se documenta here .

Aparte de eso o, posiblemente, uno de los otros kits de herramientas web para ir, tendría que hacer su propio.

Las posibles soluciones podrían ser:

  • goroutine por sesión de usuario para almacenar variables de sesión en la memoria.
  • almacena tus variables en una cookie de sesión.
  • use una base de datos para almacenar los datos de la sesión del usuario.

Dejaré los detalles de implementación de cada uno de ellos al lector.