Golang-session管理

本文将演示如何通过包 gorilla/sessions 做session管理,session是服务端存储用户数据的形式,浏览器的每次请求,都会将存储用户信息的cookie发送给服务端。由于http协议是无状态的,所以通过cookie session 记录用户的登录状态是一种再常见不过的方式。

本文将通过一个实例演示三个页面来模拟 登录认证,授权访问,注销登录的三个过程。用户首先会访问/login,服务端通过session记录用户登录状态,并将cookie信息返回给用户,下一次用户携带cookie访问/secret页面,服务器查看session发现该用户已经登录所以才能够正常访问。如果用户想退出登录,则访问/logout页面即可。

package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/sessions"
)

var (
	// key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
	key = []byte("super-secret-key")
	store = sessions.NewCookieStore(key)
)

func secret(w http.ResponseWriter, r *http.Request) {
	session, _ := store.Get(r, "cookie-name")

	// Check if user is authenticated
	if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
		http.Error(w, "Forbidden", http.StatusForbidden)
		return
	}

	// Print secret message
	fmt.Fprintln(w, "The cake is a lie!")
}

func login(w http.ResponseWriter, r *http.Request) {
	session, _ := store.Get(r, "cookie-name")

	// Authentication goes here
	// ...

	// Set user as authenticated
	session.Values["authenticated"] = true
	session.Save(r, w)
}

func logout(w http.ResponseWriter, r *http.Request) {
	session, _ := store.Get(r, "cookie-name")

	// Revoke users authentication
	session.Values["authenticated"] = false
	session.Save(r, w)
}

func main() {
	http.HandleFunc("/secret", secret)
	http.HandleFunc("/login", login)
	http.HandleFunc("/logout", logout)

	http.ListenAndServe(":8080", nil)
}

效果展示

1. 首次未登录访问/secret2. 访问/login进行登录
3. 再次访问/secret4. 访问/logout注销登录
在 Iris 中使用 Session 需要使用第三方库 iris/sessions。这个库提供了一个简单而强大的 Session 管理器,使得在应用程序中使用 Session 变得非常容易。 首先,需要在应用程序中导入 iris/sessions 包。可以使用 go get 命令来安装它: ``` go get -u github.com/kataras/iris/sessions ``` 然后,创建一个 Session 管理器: ``` package main import ( "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/sessions" ) func main() { app := iris.New() // 创建一个新的 Session 管理器 manager := sessions.New(sessions.Config{ Cookie: "myapp_session", Expires: 24 * time.Hour, AllowReclaim: true, }) // 将 Session 管理器注册到应用程序中 app.Use(manager.Handler()) // ... } ``` 在上面的代码中,我们创建了一个名为 manager 的 Session 管理器,并将其注册到应用程序中。这将使所有的路由处理程序都能够访问 Session 对象。 现在,我们可以在路由处理程序中使用 Session 了: ``` func myHandler(ctx iris.Context) { // 从会话中获取一个名为 "username" 的值 username := ctx.Session().GetString("username") if username != "" { ctx.WriteString("Hello, " + username + "!") } else { ctx.WriteString("Please log in first.") } } ``` 在上面的代码中,我们使用 Session 对象的 GetString 方法从 Session 中获取一个名为 "username" 的值。如果该值存在,则向客户端发送一个欢迎消息,否则提示用户先登录。 最后,我们还可以将值保存到 Session 中: ``` func loginHandler(ctx iris.Context) { username := ctx.FormValue("username") // 将用户名保存到会话中 ctx.Session().Set("username", username) ctx.WriteString("Welcome, " + username + "!") } ``` 在上面的代码中,我们使用 Session 对象的 Set 方法将用户名保存到 Session 中,以便后续使用。 这就是在 Iris 中使用 Session 的基本方法。要了解更多信息,请参阅官方文档:https://github.com/kataras/iris/tree/v12/sessions。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alphathur

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值