Golang:重定向两次并导致http:multiple response.WriteHeader调用

时间:2016-02-08 18:12:12

标签: go

我有一个非常奇怪的输出......让我先发布我的代码,然后我会解释:

在主要功能下我声明了

manageMux.HandleFunc("/info", info)

首先我登录并从“/ login”重定向到页面“/”:

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:multiple response.WriteHeader calls”。同时,一个名为“found”的链接显示在我的页面底部(很奇怪!),当我点击“找到”链接时,我将所有解析后的模板打印在服务器端而不是网页上。

有谁知道为什么......?以及如何修复错误并在客户端网页上打印内容?谢谢!!!

2 个答案:

答案 0 :(得分: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上存储非敏感数据可能是一种选择?没有什么比这个更好了(它在例子中有真正的choc-chip cookies ;-)):https://astaxie.gitbooks.io/build-web-application-with-golang/content/en/06.1.html

答案 1 :(得分:0)

manage处理程序中,您正在执行将写入http.ResponseWriter并触发http.StatusOK(200)状态代码的模板。之后您无法重定向,因为这需要发送不同的响应代码。

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