为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡子哥哥 2021-12-07 19:36:55
我有一个非常奇怪的输出......让我先发布我的代码然后我会解释:在我声明的主要功能下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”链接时,我将所有解析的模板打印在服务器端而不是网页上。有谁知道为什么...?以及如何修复错误并在客户端网页上打印内容?谢谢!!!
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超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。


查看完整回答
反对 回复 2021-12-07
?
HUX布斯

TA贡献1876条经验 获得超6个赞

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

如果需要重定向,请在执行模板之前进行。


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 400 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信