在Internet Explorer中转到大猩猩会话

时间:2013-06-11 20:57:52

标签: internet-explorer session cookies go

我使用Go制作一个简单的Web应用程序,使用gorilla进行会话和路由,使用小胡子进行模板制作。我认为登录问题涉及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登录时,用户被重定向回到登录页面,因为会话值"用户名"是nil,而在Chrome中,正确定义了用户名并提供了索引页面。出于某种原因,IE不接受cookie,但我更改了IE中的所有设置以允许来自任何站点的cookie。我是否需要更改其中一个Cookie选项或向Cookie添加内容而不是" MaxAge"让IE接受吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

所述选项限制cookie对整个页面的给定路径的可用性 使用"/"

请注意,max-age设置为not supported by IE

  

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

顺便说一句,您不需要MaxAge会话Cookie(来自IE manual on cookies):

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

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

答案 1 :(得分:1)

我遇到类似的问题,使用Gorilla会话注销不能在IE9上运行(尽管登录工作正常)。

我最终发现IE正在缓存对我的API端点的响应并将缓存(304 NOT MODIFIED)API响应发送到客户端,即使cookie值发生变化。

强制API端点永远不会被缓存修复问题:

w.Header().Set("Expires", "Tue, 03 Jul 2001 06:00 GMT")
w.Header().Set("Last-Modified", "{now} GMT")
w.Header().Set("Cache-Control", "max-age=0, no-cache, must-revalidate, proxy-revalidate")