2016-02-08 33 views
0

我有一個很奇怪的輸出...讓我後我的代碼首先然後我會解釋:Golang:重定向兩次,導致HTTP:多response.WriteHeader調用

在主要功能我宣佈

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) 
    } 
} 

然後我重定向到另一頁「/信息」(這隻有按鈕):

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:multiple response.WriteHeader calls」。同時,在我的頁面底部顯示一個名爲「found」的鏈接(奇怪!),當我點擊「found」鏈接時,我將所有解析的模板打印在服務器端而不是網頁上。

有誰知道爲什麼...?以及如何解決錯誤和在客戶端網頁上打印的東西?謝謝!!!

+0

請注意,您正在解析處理程序中的所有模板。這可能會拖累演出。 http://stackoverflow.com/questions/28451675/it-takes-too-much-time-when-using-template-package-to-generate-a-dynamic-web-p – nosequeldeebee

回答

1

正如JimB已經指出的那樣:您的服務器會感到困惑,因爲與寫入http.ResponseWriterredirect都有不同的狀態代碼。你不能同時做兩個。

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

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

func myHandler(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("My-Awesome-Header", "Rocks") 
    ... 
} 

會議: 你,據我所看到談論的訪問控制,我認爲堅持用戶數據是通過會話做得更好。示例:您可以使用數據庫或會話處理程序,如https://github.com/gorilla/sessions。看看這個帖子:Best practice with sessions (gorilla/sessions)

餅乾: 我不知道你使用的是什麼樣的前端,而是存儲在cookie的非敏感數據可能是一個選擇嗎?沒有什麼比這個更好(它在例子中有真正的巧克力餅乾;-)):https://astaxie.gitbooks.io/build-web-application-with-golang/content/en/06.1.html

0

在您的manage處理程序中,您正在執行將寫入http.ResponseWriter並觸發http.StatusOK(200)狀態碼的模板。之後您不能重定向,因爲這需要發送不同的響應代碼。

如果您需要重定向,請在執行模板之前執行此操作。

+0

可能跳轉到另一個頁面而不使用重定向並仍然攜帶用戶標識?如果沒有,那麼是否有任何響應代碼可以用來重定向? thx – Kyle

+0

@Kyle:標題將保留一個重定向;這就是你所說的「攜帶用戶標識」。重定向*是一個響應代碼,加上「位置」標題,所以我根本不知道第二個問題的含義。 – JimB

相關問題