进行多个响应.WriteHeader调用

时间:2018-06-23 21:04:49

标签: http redirect go

因此,我正在编写一个基本的Web应用程序,并且在成功登录后无法重定向用户。代码是:

t, err := template.ParseFiles("home.html")
if err != nil {
    log.Fatal("template.ParseFiles: ", err)
}

err = t.Execute(w, nil)
if err != nil {
    log.Fatal("t.Execute: ", err)
}

if r.Method == "POST" {
    r.ParseForm()
    user := r.FormValue("username")
    pass := r.FormValue("password")

    if checkLogin(user, pass) {
        loggedIn = true
        http.Redirect(w, r, "/home", 302)
    }
}

错误消息是:“ http:多个响应。WriteHeader调用”。

我的问题是,在不调用t.Execute设置标题的情况下,我看不到一种提供包含登录表单的html文件的方法。

如何显示登录页面并且仍然能够重定向到其他页面?

2 个答案:

答案 0 :(得分:1)

  

如何显示登录页面并且仍然能够重定向到其他页面?

具有不同的身份验证路由。使登录表单提交到身份验证路由。还有一个单独的身份验证处理程序。

例如,您的登录表单:

<form method="post" action="/auth">

您的Go main:

http.HandleFunc("/", homeHandler)
http.HandleFunc("/auth", authHandler)

完成身份验证处理后,您可以将用户重定向到适当的页面。您可以在查询字符串中传递一个参数,该参数包含重定向的目标路径。

答案 1 :(得分:0)

您正在编写(使用w),然后稍后尝试使用w标头重定向来重定向(也使用302)。

您只能发送一次标头,并且如果您开始写入w,它将假定200标头(确定)

此外,最好在写入ResponseWriter(w)之前检查http.Method

而且,记住要在重定向后return或将ResponseWriter和Request对移交给另一个函数!

希望这会有所帮助。