簡體   English   中英

Golang:兩次重定向並導致http:多次響應。WriteHeader調用

[英]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.ResponseWriterredirect都有不同的狀態代碼。 您不能同時執行兩項操作。

實際上,我想進一步擴展如何將數據傳送到下一頁(假設您正在重定向)。

標頭您可以將一些信息寫入請求對象,並在目標頁面上接收它。 例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM