繁体   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