Aula 07 – Golang para Web – Sessões
Aula 07 – Golang para Web – Sessões – Sessions
Voltar para página principal do blog
Todas as aulas desse curso
Aula 06 Aula 08
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Código da aula: Github
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no GITHUB.
Ah, se puder, clica na estrela nos meus repositórios pra dá uma força ao meu perfil no GITHUB.
Sessões
Vamos adicionar sessões ao nosso aplicativo usando as sessões do pacote gorilla.
Sessões é como mantemos algumas informações ou estado das solicitações HTTP com informações associadas ao visitante.
Um exemplo de uso é saber, por exemplo, se um visitante está logado ou não, você pode usar uma sessão para acompanhar isso e saber quem eles são.
Instalação do gorilla sessions
O primeiro passo é instalar o pacote, no terminal digite:
go get github.com/gorilla/sessions
Importação no main.go
Agora precisamos importar ele em nossa aplicação.
Objeto Session
Vamos criar um objeto session para configurar as sessões.
Há várias formas de manter a sessão, nós iremos utilizar cookies.
O []byte(“t0p-s3cr3t”) passado como parâmetro para a session, é usado para assinar os cookies de um determinado usuário, ou seja, tudo que é armazenado na session usa o “t0p-s3cr3t” como assinatura.
O gorilla session só vai aceitar coockie assinado com o “t0p-s3cr3t”.
Isso é usado para evitar que usuários maliciosos editem os cookies, forjando estar logado, ou logado como se fosse outra pessoa, enfim, é uma questão de segurança.
Para que isso funcione, você precisa escolher uma chave secreta aleatória.
3 novos manipuladores
Na verdade 2 manipuladores, o terceiro é só para testar o session.
Um vai entregar e receber solicitações GET e responderá com o modelo contendo um formulário de login.
O outro vai lidar com as solicitações de postagem (POST), ou seja, vai lidar o próprio envio do formulário.
Vamos colocar também um GET para o /test, só para testar se o session tá funcionando.
Seguindo
/main.go:
package main
import (
"html/template"
"net/http"
"github.com/go-redis/redis"
"github.com/gorilla/mux"
"github.com/gorilla/sessions"
)
//globals variables
var client *redis.Client
var store = sessions.NewCookieStore([]byte("t0p-s3cr3t"))
var templates *template.Template
func main() {
client = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
templates = template.Must(template.ParseGlob("templates/*.html"))
r := mux.NewRouter()
r.HandleFunc("/contact", contactHandler).Methods("GET")
r.HandleFunc("/about", aboutHandler).Methods("GET")
r.HandleFunc("/", indexGetHandler).Methods("GET")
r.HandleFunc("/", indexPostHandler).Methods("POST")
r.HandleFunc("/login", loginGetHandler).Methods("GET")
r.HandleFunc("/login", loginPostHandler).Methods("POST")
r.HandleFunc("/test", testGetHandler).Methods("GET")
fs := http.FileServer(http.Dir("./static/"))
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
http.Handle("/", r)
http.ListenAndServe(":8001", nil)
}
//request hello handle
func indexGetHandler(w http.ResponseWriter, r *http.Request) {
comments, err := client.LRange("comments", 0, 10).Result()
if err != nil {
return
}
templates.ExecuteTemplate(w, "index.html", comments)
}
func indexPostHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
comment := r.PostForm.Get("comment")
client.LPush("comments", comment)
http.Redirect(w, r, "/", 302)
}
func loginGetHandler(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "login.html", nil)
}
func loginPostHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
username := r.PostForm.Get("username")
session, _ := store.Get(r, "session")
session.Values["username"] = username
session.Save(r, w)
}
func testGetHandler(w http.ResponseWriter, r *http.Request) {
// grab the session
session, _ := store.Get(r, "session")
// grab the username from the session object
untyped, ok := session.Values["username"]
// Verify that the username was actually there
if !ok {
return
}
// quick type assertion because the object store the data as
// empty interface
username, ok := untyped.(string)
if !ok {
return
}
// if pass in all these tests, write a
// byte array with the username
w.Write([]byte(username))
}
//request contact page handle
func contactHandler(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "contact.html", "This is the contact page!")
}
//request about page handle
func aboutHandler(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "about.html", "This is the about page!")
}
HTML da página de login
Vamos criar também o html da página de login.
web_app/templates/login.html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<form method="POST">
Username: <input name="username">
<div>
<button type="submit">Login</button>
</div>
</form>
</body>
</html>
Agora vamos rodar nossa aplicação:
go run main.go
Acesse:
localhost:8000/login
Digite um nome qualquer para o login, em seguida acesse:
localhost:8000/test
O nome que você digitou deve aparecer na página, isso mostra que nossa sessão tá funcionando.