El uso en Ir Sesión

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 () 
	}) 
}

  

Supongo que te gusta

Origin www.cnblogs.com/FSH1014/p/12585452.html
Recomendado
Clasificación