我正在使用Go创建一个简单的Web应用程序,用于会话和路由的大猩猩,以及用于模板的小胡子。我认为登录有问题,我认为这是IE接受Cookie的问题。该问题仅在Internet Explorer上出现,否则登录在Chrome中可以正常使用。这是我的代码:
func main() { r := mux.NewRouter() r.HandleFunc("/performance", Index) r.HandleFunc("/performance/login", Login) log.Fatal(http.ListenAndServe(":5901", r)) } func Index(w http.ResponseWriter, r *http.Request) { session, _ := store.Get(r, "performance") if session.Values["username"] == nil { http.Redirect(w, r, "/performance/login", http.StatusSeeOther) } dict := session.Values fmt.Fprintf(w, mustache.RenderFileInLayout("templates/index.html", "templates/basepage.html", dict)) } func Login(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { results := 0 r.ParseForm() u := r.FormValue("username") pass := r.FormValue("password") p := PassEncrypt(pass) q := map[string]string{} rows, err := db.Query("SELECT username, name, title FROM user WHERE (username=$1) AND (password=$2)", u, p) if err != nil { log.Fatal(err) } for rows.Next() { var username string var name string var title string if err := rows.Scan(&username, &name, &title); err != nil { log.Fatal(err) } q["username"] = username q["name"] = name q["title"] = title results++ } if results > 0 { session, _ := store.Get(r, "performance") session.Options = &sessions.Options{ MaxAge: 900, } session.Values["username"] = q["username"] session.Values["name"] = q["name"] session.Values["title"] = q["title"] session.Save(r, w) http.Redirect(w, r, "/performance", http.StatusSeeOther) } else { http.Redirect(w, r, "/performance/login", http.StatusSeeOther) } } else { fmt.Fprintf(w, mustache.RenderFileInLayout("templates/login.html", "templates/basepage.html", nil)) } }
使用IE登录时,由于会话值“ username”为nil,用户将被直接重定向回登录页面,而在Chrome中,正确定义了用户名并提供了索引页面。出于某些原因,IE不接受Cookie,但是我更改了IE中的所有设置以允许来自任何站点的Cookie。我是否需要更改Cookie选项之一或向Cookie添加“ MaxAge”以外的其他内容,以使IE能够接受它?提前致谢。
您可能需要在选项中定义cookie的路径。以下选项struct应该可以解决问题:
session.Options = &sessions.Options{ Path: "/performance", }
对于整个页面的使用,上述选项将cookie的可用性限制为给定的路径"/"。
"/"
请注意,IE不支持该max- age设置:
max- age
[…] Internet Explorer(包括IE8)不尝试支持cookie的任何RFC。WinINET(IE下的网络堆栈)具有基于RFC Netscape之前的cookie草案规范的cookie实现。这意味着在Internet Explorer的任何版本中均不支持max- age,版本化cookie等指令。
顺便说一句,您不需要MaxAge会话cookie(来自IE的cookie手册):
MaxAge
(expires=date;) If you set no expiration date on a cookie, it expires when the browser closes. If you set an expiration date, the cookie is saved across browser sessions. If you set an expiration date in the past, the cookie is deleted. Use Greenwich Mean Time (GMT) format to specify the date.
所有主要的浏览器都应该如此。