Kode ini adalah leverage di sini

Kode di bawah ini digunakan untuk membuat sesi pengguna di Go. Sesi ini bekerja dengan baik.

Masalah yang saya alami adalah setelah pengguna logout, jika saya mengklik tombol kembali browser. Saya kemudian masih dapat melihat detail pengguna yang keluar.

Saya memiliki solusi leverage stackoverflow di sini tetapi tidak berhasil

tautan stackoverflow

Saya juga telah menambahkan kode berikut ke handler logout

w.Header().Set("Cache-Control", "no-cache, private, max-age=0")
w.Header().Set("Pragma", "no-cache")
w.Header().Set("X-Accel-Expires", "0")

Ini kodenya

package main

import (
    "fmt"
    "net/http"
   "github.com/gorilla/sessions"
)

var (
    // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
    key = []byte("super-secret-key")
    store = sessions.NewCookieStore(key)
)

func secret(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Check if user is authenticated
    if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
        http.Error(w, "Forbidden", http.StatusForbidden)
        return
    }

    // Print secret message
    fmt.Fprintln(w, "The cake is a lie!")
        fmt.Fprintln(w, session.Values["foo"])
}

func login(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Authentication goes here

    // Set user as authenticated
  session.Values["authenticated"] = true
  session.Values["foo"] = "bar"
  session.Values[42] = 43
    session.Save(r, w)

fmt.Fprintln(w, session.Values["authenticated"])
fmt.Fprintln(w, session.Values["foo"])
fmt.Fprintln(w, session.Values["2"])
}

func logout(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Revoke users authentication
    session.Values["authenticated"] = false
        session.Values["foo"] = ""
        session.Values[42] = ""
    session.Save(r, w)

// prevent caching
w.Header().Set("Cache-Control", "no-cache, private, max-age=0")
w.Header().Set("Pragma", "no-cache")
w.Header().Set("X-Accel-Expires", "0")


}

func main() {
    http.HandleFunc("/secret", secret)
    http.HandleFunc("/login", login)
    http.HandleFunc("/logout", logout)

    http.ListenAndServe(":8000", nil)
}
go
1
Nancy Mooree 12 Maret 2019, 12:53

1 menjawab

Jawaban Terbaik

Saya khawatir tidak ada cara untuk "memperbaiki" kode Anda tanpa menggunakan JavaScript dan mengubah halaman "rahasia" sebelum meninggalkannya.

Masalahnya bukan di Go, atau di gorilla/sessions, atau bahkan di HTTP: ini adalah cara browser web melakukan caching: setidaknya di Firefox dan Chrome, saat "kembali" dan "teruskan" browser hanya menampilkan halaman yang di-cache dari disk, mengabaikan header sepenuhnya.

Oh, dan BTW: untuk mencoba memaksa browser menghentikan cache halaman, Anda harus menambahkan baris itu ke handler "rahasia", dan bukan ke "logout".

1
Juan Cespedes 12 Maret 2019, 11:23