Session
===
通过cookie获取session
生成sessionId与用户关联储存到MAP中,这里就不考虑内存问题了
```
var (
SessionMap sync.Map
)
type SessionNode struct {
Name string
Time int64
OutTime int64
}
func main() {
// 用户登陆就设置cookie
http.HandleFunc("/login",login)
// 用户访问主业验证cookie
http.HandleFunc("/home",home)
err := http.ListenAndServe(":9085", nil)
if err!= nil {
panic(err.Error())
}
}
func login(w http.ResponseWriter,r *http.Request) {
r.ParseForm()
name := r.PostForm.Get("name")
password := r.PostForm.Get("password")
// 用户验证
if name == "dollarkiller" && password == "password" {
//用户登陆成功设置cookie
id := generateSessionId()
cookie := &http.Cookie{Name: "session",Value:id}
http.SetCookie(w,cookie)
// 存储用户session到map中
outtime := time.Now().Unix() + 6*60*60
i := &SessionNode{
Name:name,
Time:time.Now().Unix(),
OutTime:outtime,
}
SessionMap.Store(id,i)
fmt.Println(i)
fmt.Println(id)
w.WriteHeader(200)
w.Header().Set("Content-Type","application/json")
resp := map[string]interface{} {
"msg":"login OK",
}
bytes, _ := json.Marshal(resp)
w.Write(bytes)
return
}
w.WriteHeader(400)
w.Header().Set("Content-Type","application/json")
resp := map[string]interface{} {
"msg":"error",
}
bytes, _ := json.Marshal(resp)
w.Write(bytes)
}
// 用户携带sessionId前来
func home(w http.ResponseWriter,r *http.Request) {
// 检测sessionId
cookie, e := r.Cookie("session")
if e != nil {
fmt.Println("错误:",e.Error())
http.Redirect(w,r,"/login",301)
return
}
session := cookie.Value
// 根据session去map中查询是否存在
value, ok := SessionMap.Load(session)
if ok!=true {
fmt.Println("用户不存在")
http.Redirect(w,r,"/login",301)
return
}
nowTime := time.Now().Unix()
i := value.(*SessionNode)
ctime := i.Time
outTime := i.OutTime
fmt.Println("ss: ",nowTime)
fmt.Println("ssb: ",outTime)
if nowTime > ctime && nowTime < outTime {
i2 := map[string]interface{} {
"msg":"ok",
}
w.WriteHeader(200)
w.Header().Set("Content-Type","application/json")
bytes, _ := json.Marshal(i2)
w.Write(bytes)
return
}
http.Redirect(w,r,"/login",301)
}
// 生成session id
func generateSessionId() string {
intn := rand.Intn(100000) // 随机数
unix := time.Now().UnixNano() // 时间
encode := Md5Encode(strconv.FormatInt(unix, 10) + strconv.Itoa(intn))
return encode
}
func Md5Encode(str string) string {
data := []byte(str)
md5Ctx := md5.New()
md5Ctx.Write(data)
cipherStr := md5Ctx.Sum(nil)
return hex.EncodeToString(cipherStr)
}
```
我在这里也实现了一个seeion简单的
```
package utils
import (
"math/rand"
"strconv"
"sync"
"time"
)
// session 库
var (
SessionMap sync.Map
)
type SessionNode struct {
Name string
CreationTime int64 // 创建时间
ExpirationTime int64 // 过期时间
}
// 获得session
func GetSession(name string) string {
timeNano := time.Now().UnixNano()
time := time.Now().Unix()
outtime := time + 6*60*60
intn := rand.Intn(100000)
encode := Md5Encode(strconv.FormatInt(timeNano, 10) + strconv.Itoa(intn))
node := &SessionNode{
Name: name,
CreationTime: time,
ExpirationTime: outtime,
}
SessionMap.Store(encode,node)
return encode
}
// 验证session
func CheckSession(sessionId string) bool {
if sessionId == "" || len(sessionId) == 0 {
return false
}
value, ok := SessionMap.Load(sessionId)
if ok != true {
return false
}
node := value.(*SessionNode)
nowTime := time.Now().Unix()
if nowTime >= node.CreationTime && nowTime < node.ExpirationTime {
return true
}
return false
}
```
- 初认GOlang Web
- 关于环境配置
- 路由
- 路由进阶与目录架构
- 静态文件服务器
- 自定义Middleware
- 与MySQL起舞
- 主从模式概念
- 部署主从集群
- 分库分表
- 补充:事务
- 补充:常用SQL示例
- Template使用
- 一些小的,但是要知道的东西
- 调度任务
- 流控算法
- 鉴权
- JWT鉴权前置知识:加密解密
- session
- 文件上传与下载
- 带缓存读写拷贝io
- 参考
- 写好的文件上传
- 文件下载
- 拓展:秒传功能实现
- 扩展:分块上传和断点续传
- 扩展:分块上传
- 扩展:断点续传
- 扩展:分布式存储
- 部署ceph集群
- cephAuth
- go操作ceph集群
- 扩展:云存储
- go操作oss
- 补充:xorm框架
- 命令小结
- 补充:xorm框架高级部分
- 补充
- MongoDB
- 基础概念
- 简简单单NoSql
- 操作集合(Collection)
- 操作文档(Document)
- 带条件的文档 db.find
- 复杂条件抽文档 db.find
- redis
- redis操作
- go操作redis
- (新增)配置鉴权
- 密码学
- 文件校验算法
- 未来课程的安排
- RPC实践
- 爬虫
- 正则表达式
- 爬取手机号
- 爬取邮箱
- 爬取超链接
- 爬取身份证号
- 并发爬图片
- 扩展:CICD
- GO实现自动化部署系统
- 国际化支持
- 并发带来问题的解决
- GOWEB小知识
- Sync包讲解
- sync.Pool
- 千万级WebSocket消息推送
- 微服务入门:开篇
- 路由通讯
- RabbitMQ
- RabbitMQ工作原理和转发模式
- Dcoker 下 RabbitMQ and Ui
- Go操作RabbitMQ
- 初步微服务
- go-micro
- 补充:consul
- 快速入门
- 补充:consul超时
- 微服务架构
- 微服务架构全景图
- 服务注册和发现
- raft协议基本概念
- raft协议leader选举详解
- raft协议日志复制详解
- raft协议safefy详解
- rpc调用个服务监控
- etcd
- 命令行使用
- Golang操作etcd
- GO操作etcd OP方式 (分布式锁基础)
- etcd 分布式集群乐观锁
- (新增)鉴权
- 服务注册
- 服务发现原理
- 选项设计模式介绍
- 基于插件的注册组建
- 课前知识
- etcd注册开发1
- ffmpeg
- 2.0新的启航
- 高可用Mysql
- mysql逻辑架构
- 常见的MySQL高可用方案
- 索引
- MYSQL调优
- 什么影响了MYSQL的性能
- Mysql 服务器参数配置
- Go深入并发
- 基本同步原语
- 扩展同步原语
- 原子操作
- M P G 模型
- 简单的消息总线
- GoMicro入门
- GO任务池编写
- GO依赖注入
- 一些补充
- golang defer在什么时候执行
- 分布式理论篇(面试吹牛必备)
- CAP理论
- Raft协议
- 保证注册中心的可靠性
- 链路追踪
- 怎么实现强一致性