0

0

Go语言Web开发:在所有页面设置相同Cookie

碧海醫心

碧海醫心

发布时间:2025-10-17 09:09:13

|

375人浏览过

|

来源于php中文网

原创

go语言web开发:在所有页面设置相同cookie

本文介绍了如何在Go语言Web应用中,通过使用`net/http/cookiejar`库或更便捷的Gorilla Sessions库,实现在所有页面上设置和管理相同Cookie的方法。重点讲解了Gorilla Sessions的使用,包括Cookie存储的定义、会话初始化以及如何在页面处理器中加载、修改和保存Cookie,帮助开发者轻松实现跨页面Cookie共享。

在Web应用开发中,经常需要在多个页面之间共享用户数据,而Cookie是一种常用的解决方案。本教程将介绍如何在Go语言中实现跨页面共享Cookie,确保用户在访问不同页面时,能够保持登录状态或其他会话信息的同步。

使用Gorilla Sessions管理Cookie

虽然Go语言内置的net/http/cookiejar库可以用于管理Cookie,但使用像Gorilla Sessions这样的第三方库通常更为方便。Gorilla Sessions提供了更高级的API,简化了Cookie的创建、读取和管理过程。

安装Gorilla Sessions

首先,需要安装Gorilla Sessions库。如果你的项目使用了Go Modules,可以使用以下命令:

立即学习go语言免费学习笔记(深入)”;

go get github.com/gorilla/sessions

对于Google App Engine,你需要在你的应用目录下创建相应的目录结构并克隆仓库:

mkdir -p github.com/gorilla
cd github.com/gorilla
git clone git://github.com/gorilla/sessions.git

定义Cookie存储

接下来,定义一个Cookie存储,用于存储Cookie数据。这需要指定认证密钥(authentication key)和加密密钥(encryption key)。认证密钥用于验证Cookie的完整性,加密密钥用于加密Cookie数据。

import (
    "github.com/gorilla/sessions"
    "net/http"
)

// 认证密钥
var authKey = []byte{
    0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48,
    0x46, 0x1c, 0x06, 0xcd, 0x81, 0xfd, 0x38, 0xeb,
    0xfd, 0xa8, 0xfb, 0xba, 0x90, 0x4f, 0x8e, 0x3e,
    0xa9, 0xb5, 0x43, 0xf6, 0x54, 0x5d, 0xa1, 0xf2,
}

// 加密密钥
var encKey = []byte{
    0x31, 0x98, 0x3E, 0x1B, 0x00, 0x67, 0x62, 0x86,
    0xB1, 0x7B, 0x60, 0x01, 0xAA, 0xA8, 0x76, 0x44,
    0x00, 0xEB, 0x56, 0x04, 0x26, 0x9B, 0x5A, 0x57,
    0x29, 0x72, 0xA1, 0x62, 0x5B, 0x8C, 0xE9, 0xA1,
}

var store = sessions.NewCookieStore(authKey, encKey)

初始化会话

创建一个函数来初始化会话。这个函数会从请求中获取Cookie,如果Cookie不存在,则创建一个新的会话。

TGroupon团购系统
TGroupon团购系统

TGroupon团购系统是以php+MySQL进行开发的团购网站系统,首页能同时显示多个正在进行中的团购商品,将团购中的商品最大限度的展示在用户面前,对提升网站整体销售量有着很大的帮助。安装说明:1:环境:windows/LINUX/UNIX/apache,mysql,php2:所用语言: php,javascript,xml,html3:将程序放置空间或者服务器上,要求uploadfiles目录

下载
func initSession(r *http.Request) *sessions.Session {
    session, _ := store.Get(r, "my_cookie")
    if session.IsNew {
        session.Options.Domain = "example.org" // 设置Cookie的域名
        session.Options.MaxAge = 0           // 设置Cookie的过期时间,0表示浏览器关闭时过期
        session.Options.HttpOnly = false        // 设置Cookie是否只能通过HTTP访问
        session.Options.Secure = true          // 设置Cookie是否只能通过HTTPS访问
    }
    return session
}

注意: session.Options 允许你配置Cookie的属性,如 Domain、MaxAge、HttpOnly 和 Secure。

  • Domain: 指定Cookie的有效域名。确保设置为你的应用的域名,以便在所有子域名上共享Cookie。
  • MaxAge: 设置Cookie的生存时间(秒)。如果设置为0,Cookie将在浏览器关闭时过期。
  • HttpOnly: 如果设置为 true,Cookie将只能通过HTTP请求访问,防止客户端脚本访问,提高安全性。
  • Secure: 如果设置为 true,Cookie将只能通过HTTPS连接发送,确保Cookie在传输过程中的安全性。

在页面处理器中使用Cookie

在你的页面处理器中,首先调用 initSession 函数获取或创建会话。然后,你可以设置会话的值,并保存会话。

func ViewPageHandler(w http.ResponseWriter, r *http.Request) {
    session := initSession(r)
    session.Values["page"] = "view" // 设置会话的值
    err := session.Save(r, w)         // 保存会话
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    // ... 其他处理逻辑
}

注意事项:

  • 确保在每次修改会话后都调用 session.Save(r, w) 保存会话。
  • 错误处理:session.Save 方法可能会返回错误,需要进行适当的错误处理。

完整示例

以下是一个完整的示例,展示了如何在Go语言Web应用中使用Gorilla Sessions来管理Cookie:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/sessions"
)

var (
    // 认证密钥
    authKey = []byte("super-secret-key")
    // 加密密钥
    encKey = []byte("a-very-long-authentication-key")

    store = sessions.NewCookieStore(authKey, encKey)
)

func initSession(r *http.Request) *sessions.Session {
    session, _ := store.Get(r, "my_cookie")
    if session.IsNew {
        session.Options.Domain = "localhost"
        session.Options.MaxAge = 3600 // Cookie有效期1小时
        session.Options.HttpOnly = true
        session.Options.Secure = false // 开发环境设置为false,生产环境设置为true
    }
    return session
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    session := initSession(r)
    session.Values["page"] = "home"
    err := session.Save(r, w)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    fmt.Fprintln(w, "Welcome to the home page!")
}

func aboutHandler(w http.ResponseWriter, r *http.Request) {
    session := initSession(r)
    page, ok := session.Values["page"].(string)
    if !ok {
        page = "unknown"
    }

    fmt.Fprintf(w, "You are on the about page. Last page visited: %s\n", page)
}

func main() {
    http.HandleFunc("/", homeHandler)
    http.HandleFunc("/about", aboutHandler)

    fmt.Println("Server listening on port 8080")
    http.ListenAndServe(":8080", nil)
}

总结:

通过使用Gorilla Sessions,你可以轻松地在Go语言Web应用中管理Cookie,实现跨页面共享数据。记住要正确配置Cookie的属性,以确保应用的安全性。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6422

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

345

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

314

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

745

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.09.06

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.9万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号