我有一个非常奇怪的输出......让我先发布我的代码,然后我会解释:
在主要功能下我声明了
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”的链接显示在我的页面底部(很奇怪!),当我点击“找到”链接时,我将所有解析后的模板打印在服务器端而不是网页上。
有谁知道为什么......?以及如何修复错误并在客户端网页上打印内容?谢谢!!!
答案 0 :(得分:1)
正如JimB已经指出的那样:您的服务器感到困惑,因为写入http.ResponseWriter
和redirect
的状态代码不同。你不能同时做到这两点。
我实际上想更多地介绍如何将数据传输到下一页(假设您正在重定向)。
<强>接头强> 您可以将一些信息写入请求对象并在目标页面上接收它。例如:
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)状态代码的模板。之后您无法重定向,因为这需要发送不同的响应代码。
如果您需要重定向,请在执行模板之前执行此操作。