猿问

Golang:重定向两次并导致 http:多次响应.WriteHeader 调用

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


在我声明的主要功能下


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 调用”。同时,我的页面底部显示了一个名为“found”的链接(奇怪!),当我单击“found”链接时,我将所有解析的模板打印在服务器端而不是网页上。


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


胡子哥哥
浏览 401回答 2
2回答

临摹微笑

正如JimB已经指出:你的服务器会很困惑,因为有与两个写入相关的不同状态代码http.ResponseWriter和redirect。你不能同时做这两件事。我实际上想详细说明如何将数据传送到下一页(假设您正在重定向)。Headers 您可以将一些信息写入请求对象并在目标页面上接收它。例子:func myHandler(w http.ResponseWriter, r *http.Request) {    w.Header().Set("My-Awesome-Header", "Rocks")    ...}会话: 据我所知,您正在谈论访问控制,我认为通过会话来保存用户数据更好。示例:您可以使用数据库或会话处理程序,如https://github.com/gorilla/sessions。查看此主题:会话的最佳实践(大猩猩/会话)。Cookies: 我不确定您使用的是哪种前端,但在 cookie 上存储非敏感数据可能是一种选择?没有什么比这更好的了(示例中它有真正的巧克力饼干 ;-) ):https : //ataxie.gitbooks.io/build-web-application-with-golang/content/en/06.1.html。

HUX布斯

在您的manage处理程序中,您正在执行模板,该模板将写入http.ResponseWriter并触发http.StatusOK(200) 状态代码。之后您无法重定向,因为这需要发送不同的响应代码。如果需要重定向,请在执行模板之前进行。
随时随地看视频慕课网APP

相关分类

Go
我要回答