golang实现session 多用户
时间: 2023-09-25 09:10:41 浏览: 165
golang实现多用户通信系统
好的,这里给你一个简单的 Go 语言实现 session 的多用户登录的例子:
```go
package main
import (
"fmt"
"net/http"
"github.com/gorilla/sessions"
)
type User struct {
username string
password string
}
var users = []User{
{"user1", "password1"},
{"user2", "password2"},
{"user3", "password3"},
}
var store = sessions.NewCookieStore([]byte("secret"))
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 获取 session
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 检查是否已经登录
if username, ok := session.Values["username"].(string); ok {
fmt.Fprintf(w, "欢迎 %s 登录!", username)
return
}
// 如果未登录,则显示登录界面
fmt.Fprint(w, `
<form method="POST" action="/login">
<label>用户名:</label>
<input type="text" name="username"><br>
<label>密码:</label>
<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
`)
})
http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
// 获取 session
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 获取表单数据
username := r.FormValue("username")
password := r.FormValue("password")
// 遍历用户列表,验证用户名和密码是否匹配
for _, user := range users {
if user.username == username && user.password == password {
// 登录成功,将用户名保存到 session 中,并跳转到首页
session.Values["username"] = username
session.Save(r, w)
http.Redirect(w, r, "/", http.StatusFound)
return
}
}
// 登录失败,重新显示登录界面
fmt.Fprint(w, `
<p>用户名或密码不正确,请重新登录。</p>
<form method="POST" action="/login">
<label>用户名:</label>
<input type="text" name="username"><br>
<label>密码:</label>
<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
`)
})
http.ListenAndServe(":8080", nil)
}
```
以上代码使用了 Gorilla 的 sessions 包来实现 session 功能。在首页中,会先获取 session,然后检查是否已经登录,如果已经登录,则输出欢迎信息;否则显示登录界面。在登录接口中,会先获取表单数据,然后遍历用户列表,逐个验证用户名和密码是否匹配。如果登录成功,则将用户名保存到 session 中,并跳转到首页;否则重新显示登录界面。
阅读全文