大猩猩会议.AddFlash不添加Flash消息



我有一个带有两个处理程序的注册页面,一个用于显示表单,另一个用于处理表单提交。

我正在尝试使用会话。AddFlash方法保存错误,然后执行302重定向回注册表并显示错误。

我建立了一个会话存储:

package web
import (
    "github.com/gorilla/sessions"
)
var sessionStore = sessions.NewCookieStore([]byte(sessionSecret))

然后我的处理程序看起来是这样的:

package web
import (
    "html/template"
    "log"
    "net/http"
)
func registerForm(w http.ResponseWriter, r *http.Request) {
    session, err := sessionStore.Get(r, "mysession")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    data := map[string]interface{}{}
    log.Print("Flashes: ")
    log.Print(session.Flashes())
    if flashes := session.Flashes(); len(flashes) > 0 {
        data["error"] = flashes[0]
    }
    tmpl, _ := template.ParseFiles("web/templates/register.html.tmpl")
    tmpl.Execute(w, data)
}
func register(w http.ResponseWriter, r *http.Request) {
    session, err := sessionStore.Get(r, "mysession")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    r.ParseForm()
    username := r.Form["username"][0]
    password := r.Form["password"][0]
    if UserExists(username) {
        log.Print("Username already taken")
        session.AddFlash("Username already taken")
        http.Redirect(w, r, "/web/register", http.StatusFound)
        return
    }
    _, err = CreateUser(username, password)
    log.Print(err)
    if err != nil {
        session.AddFlash(err.Error())
        http.Redirect(w, r, "/web/register", http.StatusFound)
        return
    }
    http.Redirect(w, r, "/web/login", http.StatusFound)
}

通过添加日志,我可以看到UserExists返回true,因此应该添加一条flash消息,但在重定向到表单处理程序后,会话中没有保存任何flash消息。

我认为在重定向之前必须保存会话。

session.Save(r, w)

http://www.gorillatoolkit.org/pkg/sessions#Session.Save

最新更新