[英]Golang: redirect twice and cause http: multiple response.WriteHeader calls
我的輸出很奇怪...讓我先發布代碼,然后再解釋:
在我聲明的主要功能下
manageMux.HandleFunc("/info", info)
首先,我登錄並從“ /登錄”重定向到頁面“ /”:
func login(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, err := template.ParseFiles("manage/login.html")
checkError(err)
t.Execute(w, nil)
} else { //POST
r.ParseForm()
//do some authentications here
http.Redirect(w, r, "/", http.StatusFound)
}
}
然后,我從當前頁面“ /”(只有按鈕)重定向到另一個頁面“ / info”:
func manage(w http.ResponseWriter, r *http.Request) {
t, err := template.ParseFiles("manage/manage.html")
checkError(err)
t.Execute(w, nil)
r.ParseForm()
if r.Form["Button"] != nil { //to get only POST actions from buttons
if r.Form["Button"][0] == "Log" {
http.Redirect(w, r, "/info", http.StatusFound)
}
}
}
最后,我制作了一個模板,想在客戶端顯示:
const tpl=`stuff inside`
type InfoDefault struct {
//stuff inside
}
func info(w http.ResponseWriter, r *http.Request) {
info := InfoDefault{
//stuff inside
}
t, err := template.New("info").Parse(tpl)
checkError(err)
err = t.Execute(os.Stdout, info)
checkError(err)
}
現在,奇怪的是,當我單擊頁面“ /”上的按鈕時,出現了錯誤“ http:多個response.WriteHeader調用”。 同時,在頁面底部顯示一個名為“找到”的鏈接(很奇怪!),當我單擊鏈接“找到”時,我將所有解析的模板打印在服務器端而不是網頁上。
有誰知道為什么...? 以及如何解決錯誤並在客戶端網頁上打印內容? 謝謝!!!
正如JimB所指出的:您的服務器感到困惑,因為寫入http.ResponseWriter
和redirect
都有不同的狀態代碼。 您不能同時執行兩項操作。
實際上,我想進一步擴展如何將數據傳送到下一頁(假設您正在重定向)。
標頭您可以將一些信息寫入請求對象,並在目標頁面上接收它。 例:
func myHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("My-Awesome-Header", "Rocks")
...
}
會話:據我所知,您正在談論訪問控制,我認為通過會話更好地保存用戶數據。 示例:您可以使用數據庫或會話處理程序,例如https://github.com/gorilla/sessions 。 查看此線程: 會話最佳實踐(大猩猩/會話) 。
Cookies:我不確定您使用的是哪種前端,但是可以在cookie上存儲非敏感數據嗎? 沒有什么比這更好的了(示例中包含真正的choc-chip cookie ;-)): https : //astaxie.gitbooks.io/build-web-application-with-golang/content/en/06.1.html 。
在您的manage
處理程序中,您正在執行模板,該模板將寫入http.ResponseWriter
並觸發http.StatusOK
(200)狀態代碼。 之后,您將無法重定向,因為這需要發送其他響應代碼。
如果需要重定向,請在執行模板之前進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.