当前位置: 首页 > 面试题库 >

Internet Explorer中的Go和大猩猩会话

齐招
2023-03-14
问题内容

我正在使用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设置:

[…] 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.

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



 类似资料:
  • 大象与猩猩 是o2o平台全套解决方案,现将Wechat h5、android、iOS三套代码正式开源。

  • 问题内容: 我已经设置了Go rest api。并在登录时执行此操作: 为了检查会话,我有这样的东西: 如果我执行邮递员的请求,效果很好,但是当我从客户那里收到请求时,我会得到401。你们中的任何人是否经历过类似的事情?该商店是一个CookieStore。 我已经检查了ID,将sessionId变量替换为静态字符串。大猩猩会话使用大猩猩上下文注册一个新请求,当我这样做时,来自邮递员的请求不为空,但

  • 来自WebSocket RFC的片段: 要使用状态代码(第7.4节)/code/和可选关闭原因(第7.1.6节)/reason/启动WebSocket关闭握手,endpoint必须发送关闭控制帧,如第5.5节所述。1,其状态代码设置为/code/,关闭原因设置为/reason/。一旦endpoint发送和接收到关闭控制帧,该endpoint应按照第7.1节中的定义关闭WebSocket连接。1.

  • 问题内容: 使用大猩猩会话网络工具包时,不会跨请求维护会话变量。当我启动服务器并输入localhost:8100 /时,由于会话值不存在,页面被定向到login.html。登录后,我在商店中设置了会话变量,页面被重定向到home.html。但是,当我打开一个新选项卡并键入localhost:8100 /时,应使用已存储的会话变量将页面定向到home.html,但应将页面重定向到login.html

  • 问题内容: 在用go编写的HTTP服务器中,我使用大猩猩/多路复用器进行路由, 我想使用(和/或其他“中间件”),但我不知道该在哪里放置它们。 明确说明: 我通过创建一个新的路由器 通过类似的电话添加我的路线 我通过和创建服务器 为此,我可以在哪里插入或任何其他中间件? 问题答案: 这是您可以执行的操作: 如果您有多个HTTP处理程序,则可以将它们堆叠起来:

  • 问题内容: 我想在路由中有一个可选的URL变量。我似乎找不到使用mux包的方法。这是我目前的路线: 网址为时可以使用。我希望它能够接受,即使没有输入也可以。有什么想法吗? 问题答案: 您可以为根路径定义一个新的: 并让函数执行该路径所需的任何操作。