Web services Go lang http.Redirect不';我的服务器中没有真正的重定向

Web services Go lang http.Redirect不';我的服务器中没有真正的重定向,web-services,redirect,go,server,Web Services,Redirect,Go,Server,我有一个简单的ish聊天服务器,由于某种原因,http.Redirect函数没有真正起作用。问题是,它没有将我重定向到“/login”,而是提供了一个带有/login链接的html页面。这很烦人,因为没有CSS,而且看起来很难看 func static(w http.ResponseWriter, r *http.Request) { //check backend if user, err := aaa.CurrentUser(w, r); err == nil {

我有一个简单的ish聊天服务器,由于某种原因,http.Redirect函数没有真正起作用。问题是,它没有将我重定向到“/login”,而是提供了一个带有/login链接的html页面。这很烦人,因为没有CSS,而且看起来很难看

func static(w http.ResponseWriter, r *http.Request) {
    //check backend
    if user, err := aaa.CurrentUser(w, r); err == nil {
        //user is logged in
        log.Println(user)
        vars := mux.Vars(r)
        page := vars["page"]
        data, _ := ioutil.ReadFile("downloads/" + page)
        w.Write(data)
        return
    }else {
        //user is not logged in
        http.Redirect(w,r,"/login",http.StatusUnauthorized)
        w.Write([]byte("<script>alert('Please login')</script>"))
        return
    }
} 
func static(w http.ResponseWriter,r*http.Request){
//检查后端
如果是user,err:=aaa.CurrentUser(w,r);err==nil{
//用户已登录
log.Println(用户)
变量:=mux.vars(r)
页码:=变量[“页码”]
数据,Util:=ioutil.ReadFile(“下载/”+页面)
w、 写入(数据)
返回
}否则{
//用户未登录
重定向(w,r,“/login”,http.StatusUnauthorized)
w、 写入([]字节(“警报('请登录')))
返回
}
} 
例如,当用户未登录时,会出现javascript警报并将我带到该页面
,这是html页面包含的全部内容。只有那一个href没有标题,什么都没有

以防万一的main.go代码(应该足够了)

主程序包
进口(
“旗帜”
“fmt”
“html/模板”
“io/ioutil”
“日志”
“net/http”
“操作系统”
“字符串”
“strconv”
“时间”
“github.com/apexskier/httpauth”
“github.com/gorilla/mux”
“运行时”
)
变量(
后端httpauth.LeveldbAuthBackend
aaa httpauth.授权人
角色映射[字符串]httpauth.Role
端口=80
backendfile=“auth.leveldb”
)
func static(w http.ResponseWriter,r*http.Request){
如果是user,err:=aaa.CurrentUser(w,r);err==nil{
log.Println(用户)
变量:=mux.vars(r)
页码:=变量[“页码”]
数据,Util:=ioutil.ReadFile(“下载/”+页面)
w、 写入(数据)
返回
}否则{
w、 写入([]字节(“警报('请登录')))
重定向(w,r,“/login”,http.StatusUnauthorized)
返回
}
}
func main(){
runtime.GOMAXPROCS(runtime.numpu())
变量错误
Mkdir(后端文件,0755)
延迟os.Remove(后端文件)
//创建后端
后端,err=httpauth.NewLeveldbAuthBackend(后端文件)
如果错误!=零{
恐慌(错误)
}
//创建一些默认角色
roles=make(映射[string]httpauth.Role)
角色[“用户”]=30
角色[“管理员”]=80
aaa,err=httpauth.NewAuthorizer(后端,[]字节(“cookie加密密钥”),“用户”,角色)
//创建默认用户
用户名:=“管理员”
defaultUser:=httpauth.UserData{用户名:用户名,角色:“admin”}
err=backend.SaveUser(defaultUser)
如果错误!=零{
恐慌(错误)
}
//使用密码和电子邮件地址更新用户
err=aaa.Update(无,无,用户名,“adminadmin”admin@localhost.com")
如果错误!=零{
恐慌(错误)
}
//设置路由器和路由处理程序
flag.Parse()
hub:=newHub()
转到hub.run()
r:=mux.NewRouter()
r、 HandleFunc(“/chat”,serveChat)
r、 HandleFunc(“/ws”,func(w http.ResponseWriter,r*http.Request){
serveWs(轮毂,西,右)
})
r、 HandleFunc(“/downloads/{page}”,静态)
http.Handle(“/www/”,http.StripPrefix(“/www/”,http.FileServer(http.Dir(“/www”)))
r、 HandleFunc(“/login”,getLogin).Methods(“GET”)
r、 HandleFunc(“/register”,postRegister)。方法(“POST”)
r、 HandleFunc(“/register”,getRegister).Methods(“GET”)
r、 HandleFunc(“/login”,postLogin).Methods(“POST”)
r、 HandleFunc(“/admin”,handleAdmin).Methods(“GET”)
r、 HandleFunc(“/add_user”,postAddUser)。方法(“POST”)
r、 HandleFunc(“/change”,postChange)。方法(“POST”)
r、 HandleFunc(“/”,handlePage).Methods(“GET”)//授权页面
r、 HandleFunc(“/logout”,handleLogout)
r、 HandleFunc(“/home”,homeHandle).Methods(“GET”)
http.Handle(“/”,r)
fmt.Printf(“在端口%d上运行的服务器”,端口)
srv:=&http.Server{
地址:“:”+strconv.Itoa(港口),
读取超时:10*次。秒,
WriteTimeout:10*time.s,

MaxHeaderBytes:1
http。在写入响应头之前必须调用重定向,因此请将其放置在
w.Write
之前:

}else {
    //user is not logged in
    http.Redirect(w,r,"/login",http.StatusUnauthorized)
    w.Write([]byte("<script>alert('Please login')</script>"))
    return
}
}其他{
//用户未登录
重定向(w,r,“/login”,http.StatusUnauthorized)
w、 写入([]字节(“警报('请登录')))
返回
}

它仍然做同样的事情。在
serveChat()
中,响应编写器作为参数发送到第行
if user,err:=aaa.CurrentUser(w,r);
-现在如果此函数(CurrentUser)将某些内容写入
w
,然后发送标题,重定向标题将丢失。啊,我认为你是对的。是否有任何方法可以解决此问题?@subado512:重构代码,以便
aaa。CurrentUser
不会写出任何内容。
}else {
    //user is not logged in
    http.Redirect(w,r,"/login",http.StatusUnauthorized)
    w.Write([]byte("<script>alert('Please login')</script>"))
    return
}