作为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
但为什么要这样写呢?请有人给我一些建议!非常感谢。
答案 0 :(得分:3)
这是与HTTP协议工作相关的常见错误:cookie在HTTP respo7nse的标头中发送,在正文开始发送后无法更改。
因此,当您进行t.Execute(w, nil)
调用时,您开始编写响应正文,因此无法在之后添加Cookie。
这就是为什么在PHP中,session_start()
调用必须是页面的第一条指令,即使在任何空格之前也是如此。