模板执行()后Golang setCookie()失败

时间:2016-03-16 17:02:55

标签: templates go setcookie

作为GO的初学者,我的情况如下:

t, err := template.ParseFiles("/template/login.tpl")

err = t.Execute(w, nil)         //if executed before SetCookie

http.SetCookie(...)          //failed, browser received nothing

如果序列已更改,则首先SetCookie,它将起作用。

我的计划是ParseForm()中的login.tpl用户名和密码,如果成功,sessionID将由SetCookie发送。但现在必须在SetCookie() login.tpl之前放置Executed,这也会导致ParseForm()在执行login.tpl之前运行:

r.ParseForm( )                          //ParseForm() works even before template is executed

email := r.FormValue("email")
pass := r.FormValue("pass")

var loginPass = checkLogin(email, pass) //verify username and password

if loginPass == true {                  //if correct

    cookie1 := http.Cookie{Name: "test", Value: "testvalue", Path: "/", MaxAge: 86400}
    http.SetCookie(w, &cookie1)         //setCookie works

    fmt.Println("Login success: ", email)

} else {                                //if incorrect username or pass

    fmt.Println("Please login: ", email)

}

t, err := template.ParseFiles("/template/login.tpl")
err = t.Execute(w, nil)                 //now template execution is here, also works

但为什么要这样写呢?请有人给我一些建议!非常感谢。

1 个答案:

答案 0 :(得分:3)

这是与HTTP协议工作相关的常见错误:cookie在HTTP respo7nse的标头中发送,在正文开始发送后无法更改。

因此,当您进行t.Execute(w, nil)调用时,您开始编写响应正文,因此无法在之后添加Cookie。

这就是为什么在PHP中,session_start()调用必须是页面的第一条指令,即使在任何空格之前也是如此。