Interacción en todo el cliente y el servidor se puede resumir en los siguientes tres pasos:
- La primera vez que el cliente envía una solicitud al servidor para crear la sesión, y generar un identificador único SessionId
- SessionId servidor enviará al cliente
(en general hay dos formas comunes: la galleta y la reescritura de URL) - Cuando el cliente envía una solicitud al servidor de nuevo y SessionId envía al servidor.
Ir sesión se dan cuenta
No proporciona una implementación de Sessoin en la biblioteca estándar Go, así que vamos a aprender sobre el libro analizando el ejemplo de "Go Web Programación" cómo lograr una función de auto-Session.
(PD: Aunque la biblioteca estándar no implementa la sesión, pero hay muchos marcos web ofrecen realización de la sesión)
La realización principal de la sesión para considerar los siguientes puntos:
- sesión creado
- Gestor de Sesión Global
- SessionID singularidad mundial
- almacenamiento de sesión (se puede almacenar en la memoria, archivos, bases de datos, etc.)
- La sesión ha expirado acuerdo
El ejemplo de código siguiente ir junto con los correspondientes analizar las ideas de diseño enteras:
Sesión definido:
Sesión utiliza una estructura similar a la tabla hash (tabla hash también es posible) para guardar la información. Si usted tiene alguna experiencia en desarrollo web, usted debe saber que sólo cuatro operaciones Sesión: Establecer el valor para obtener el valor, elimine el valor actual y el acceso a SessionID.
Por lo tanto, la interfaz de sesión debe hay cuatro formas de realizar esta operación:
Tipo de interfaz Sesión { Set (clave, interfaz de valor {}) de error //设置Sesión Get (interfaz tecla {}) {} // interfaz获取Sesión Delete (interfaz tecla {}) de error //删除Sesión SessionID cadena () //当前SessionID }
Sesión se puede conservar por un número de maneras, incluyendo la memoria, archivos, bases de datos y similares, asi que aquí define una interfaz de usuario de la sesión, el almacenamiento de diferentes Sesión operativo diferente para lograr diferentes.
Session Manager:
Sabemos que los datos de la sesión se almacenan en el servidor, por lo que podemos un proveedor de interfaz abstracta para representar la estructura subyacente del Administrador de sesión. Proveedor acceder y gestionar la sesión por SessionID.
Tipo de proveedor de interfaz { SessionInit (cadena SID) (Sesión, error) SessionRead (cadena SID) (Sesión, error) SessionDestroy (cadena SID) de error SessionGC (maxLifeTime Int64) }
- SessionInit lograr la inicialización de la sesión, si los rendimientos éxito una nueva sesión
- SessionRead retorno Sesión representado por el SID correspondiente, si no está presente, se llame SessionInit sid manera de crear parámetros y devuelve una nueva variable de sesión.
- SessionDestroy da un SID, borrar la sesión.
- Según SessionGC variables de sesión maxLifeTime delete obsoleto
Buen Proveedor de definición de interfaz Después de eso, se escribe un método de registro, de modo que podamos ser capaces de encontrar su gestor de proveedor correspondiente por nombre del gestor de proveedor
los prestadores pongan = var (Mapa [String] Proveedor) // puede registrar un nombre al administrador de proveedor de sesión adquirida FUNC RegisterProvider (String nombre, oferente) { SI nula Proveedor == { pánico ( "la sesión: el proveedor de registro es nula ") } SI _, P: = Proveedores de [nombre]; P { pánico (" la sesión: el proveedor de Registro existía IS ") } Proveedores de [nombre] = Proveedor }
Proveedor después enviado a empaquetarlo, para definir un administrador global de sesión
struct {Administrador del tipo cookieName cadena // nombre de la cookie sync.Mutex bloqueo // bloqueo para garantizar la seguridad de coherencia de los datos concurrentes oferente // administrar la sesión maxlifetime Int64 // tiempo de espera } FUNC NewManager (providerName, cookieName String, Int64 maxlifetime) (* Gerente de error) { Proveedor, OK: = Proveedores [providerName] SI OK {! nula rentabilidad, fmt.Errorf ( "la sesión :? Proporcionar% Desconocido Q (Forgotten importación)", providerName) } // devuelve un objeto de administrador {& Gerente de devolver el cookieName: la cookieName, maxlifetime: maxlifetime, Proveedor: Proveedor, }, nil }
A continuación, cree una Session Manager global en el paquete principal
var globalSession * Gerente de func init () { globalSession, _ = NewManager ( "memoria", "sessionid", 3600) }
Única ID de sesión
ID de sesión se utiliza para identificar a cada usuario para acceder a la aplicación web, es necesario asegurarse de que es único a nivel mundial, el código de ejemplo:
func (gerente * Manager) sessionId () {string b: = make ([] bytes, 32) Si _, err: = io.ReadFull (rand.Reader, b); err! = nil { return "" } base64.URLEncoding.EncodeToString retorno (b) }
La creación de Sesión
Necesitamos asignar u obtener incluso Sesión asociado para cada usuario que visita, a fin de verificar el funcionamiento de acuerdo con la información de nuevo la sesión. SessionStart Esta función se utiliza para detectar si una sesión ha sucedido con el usuario actual de visitas se asocia, si no crearlo.
// si una cookie de sesión válida se determina de acuerdo a la solicitud actual no existe, crear FUNC (Agencia * Manager) SessionStart (http.ResponseWriter W, LT http.Request * I +) (la sesión Sesión) { // Un método para el bloqueo manager.lock.Lock () la manager.lock.Unlock Defer () // obtener los valores de cookie solicitan en la solicitud de galletas, ERR: = r.Cookie (manager.cookieName) Si ERR = nil || cookie.Value == "! "{ SID: = manager.sessionId () de la sesión, _ = manager.provider.SessionInit (SID) Cookie: = {http.Cookie el Nombre: manager.cookieName, Valor: url.QueryEscape (SID), un símbolo especial de escape // @ # ¥% + * - al igual que el Camino: "/", el HttpOnly: true, el MaxAge: int (manager.maxLifeTime)} http.SetCookie (W, y galletas) // nuevas configuraciones de cookies a la respuesta } else { sid, _: = url.QueryUnescape (cookie.Value) sesión, _ = manager.provider.SessionRead (sid) } retorno }
Ahora tenemos que devolver una interfaz Session variable se reúnen por el método SessionStart. Aquí un ejemplo para mostrar cómo las operaciones de lectura y escritura de la sesión:
// el nombre de usuario de la sesión de usuario se determina si la presencia, ausencia crear FUNC Login (http.ResponseWriter W, R ^ http.Request *) { Ses: globalSession.SessionStart = (W, R & lt) r.ParseForm () Nombre: sess.Get = ( "nombre de usuario") si el nombre! = nil { sess.Set ( "nombre de usuario", r.Form [ "nombre de usuario"]) // valor del formulario enviado nombre de usuario se proporciona en la sesión } }
Sesión de cierre de sesión
En las aplicaciones web a menudo tienen registros de usuario a cabo la operación, a continuación, cuando el usuario sale de la aplicación, podremos cerrar la sesión en los datos de sesión del usuario.
// SessionDestroy注销Sesión func (gerente * Manager) SessionDestroy (w http.ResponseWriter, r * http.Request) { galleta, err: = r.Cookie (manager.cookieName) ! Si ERR = nil || cookie.Value == "" { retorno } manager.lock.Lock () Defer manager.lock.Unlock () manager.provider.SessionDestroy (cookie.Value) expiredTime: = time.Now () newCookie: = {http.Cookie nombre: manager.cookieName, Path: "/", HttpOnly: true, Expira: expiredTime, MaxAge: -1, //会话级galletas } http.SetCookie (w, y newCookie) }
Ahora tenemos a la Sesión de lectura (GET), escritura (Set), método delete (destruir) de funcionamiento, la siguiente combinación de estas tres operaciones para mostrar un ejemplo:
// grabar se accede al número de la sesión FUNC COUNT (http.ResponseWriter W, R ^ http.Request *) { Ses: globalSession.SessionStart = (W, R & lt) Ejemplo // Obtener sesión createTime: = sess.Get ( "createTime" ) // obtener el tiempo de creación de la sesión SI createTime nula == { sess.Set ( "createTime", Time.now (). Unix ()) } el else if (createTime. (Int64) + 360) <(Time.now () .Unix ()) {// expirado // Salir de edad información de la sesión y una sesión nueva globalSession.SessionDestroy (W, R ^) sesión globalSession.SessionStart = (W, R ^) } Count: = sess.Get ( "countnum") Si el recuento == nil { sess.Set ( "countnum" ,. 1) } el else { sess.Set ( "countnum", COUNT. (int) +. 1) } }
Sesión de eliminación
A continuación, buscar la forma Session Manager para borrar la sesión.
// Abrir GC iniciar la función FUNC init () { Ir globalSession.SessionGC () } FUNC (Agencia * Manager) SessionGC () { manager.lock.Lock () la manager.lock.Unlock Defer () manager.provider.SessionGC (manager.maxLifeTime) // tiempo usando un paquete de funciones de temporizador, se llama automáticamente al método GC cuando la sesión de tiempo de espera time.AfterFunc (time.Duration (manager.maxLifeTime), FUNC () { manager.SessionGC () }) }