一尘不染

Internet Explorer中的Go和大猩猩会话

go

我正在使用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能够接受它?提前致谢。


阅读 254

收藏
2020-07-02

共1个答案

一尘不染

您可能需要在选项中定义cookie的路径。以下选项struct应该可以解决问题:

session.Options = &sessions.Options{
    Path: "/performance",
}

对于整个页面的使用,上述选项将cookie的可用性限制为给定的路径"/"

请注意,IE不支持max- age设置:

[…] Internet Explorer(包括IE8)不尝试支持cookie的任何RFC。WinINET(IE下的网络堆栈)具有基于RFC
Netscape之前的cookie草案规范的cookie实现。这意味着在Internet Explorer的任何版本中均不支持max-
age,版本化cookie等指令。

顺便说一句,您不需要MaxAge会话cookie(来自IE的cookie手册):

(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.

所有主要的浏览器都应该如此。

2020-07-02