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

Tutorial Go para Web com Redis

Go para Web usando Redis

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.


<!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.

Por agora é só, nos vemos próxima. 😉

Código da aula: Github

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

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. 😉

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>