fixed markdown format
This commit is contained in:
22
6.2.md
22
6.2.md
@@ -1,7 +1,7 @@
|
||||
#6.2 Go如何使用session
|
||||
# 6.2 Go如何使用session
|
||||
通过上一小节的介绍,我们知道session是在服务器端实现的一种用户和服务器之间认证的解决方案,目前Go标准包没有为session提供任何支持,这小节我们将会自己动手来实现go版本的session管理和创建。
|
||||
|
||||
##session创建过程
|
||||
## session创建过程
|
||||
session的基本原理是由服务器为每个会话维护一份信息数据,客户端和服务端依靠一个全局唯一的标识来访问这份数据,以达到交互的目的。当用户访问Web应用时,服务端程序会随需要创建session,这个过程可以概括为三个步骤:
|
||||
|
||||
- 生成全局唯一标识符(sessionid);
|
||||
@@ -15,10 +15,10 @@ session的基本原理是由服务器为每个会话维护一份信息数据,
|
||||
2. URL重写
|
||||
所谓URL重写,就是在返回给用户的页面里的所有的URL后面追加session标识符,这样用户在收到响应之后,无论点击响应页面里的哪个链接或提交表单,都会自动带上session标识符,从而就实现了会话的保持。虽然这种做法比较麻烦,但是,如果客户端禁用了cookie的话,此种方案将会是首选。
|
||||
|
||||
##Go实现session管理
|
||||
## Go实现session管理
|
||||
通过上面session创建过程的讲解,读者应该对session有了一个大体的认识,但是具体到动态页面技术里面,又是怎么实现session的呢?下面我们将结合session的生命周期(lifecycle),来实现go语言版本的session管理。
|
||||
|
||||
###session管理设计
|
||||
### session管理设计
|
||||
我们知道session管理涉及到如下几个因素
|
||||
|
||||
- 全局session管理器
|
||||
@@ -29,7 +29,7 @@ session的基本原理是由服务器为每个会话维护一份信息数据,
|
||||
|
||||
接下来我将讲解一下我关于session管理的整个设计思路以及相应的go代码示例:
|
||||
|
||||
###Session管理器
|
||||
### Session管理器
|
||||
|
||||
定义一个全局的session管理器
|
||||
|
||||
@@ -96,7 +96,7 @@ Go实现整个的流程应该也是这样的,在main包中创建一个全部
|
||||
provides[name] = provide
|
||||
}
|
||||
|
||||
###全局唯一的Session ID
|
||||
### 全局唯一的Session ID
|
||||
|
||||
Session ID是用来识别访问Web应用的每一个用户,因此必须保证它是全局唯一的(GUID),下面代码展示了如何满足这一需求:
|
||||
|
||||
@@ -108,7 +108,7 @@ Session ID是用来识别访问Web应用的每一个用户,因此必须保证
|
||||
return base64.URLEncoding.EncodeToString(b)
|
||||
}
|
||||
|
||||
###session创建
|
||||
### session创建
|
||||
我们需要为每个来访用户分配或获取与他相关连的Session,以便后面根据Session信息来验证操作。SessionStart这个函数就是用来检测是否已经有某个Session与当前来访用户发生了关联,如果没有则创建之。
|
||||
|
||||
func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (session Session) {
|
||||
@@ -142,7 +142,7 @@ Session ID是用来识别访问Web应用的每一个用户,因此必须保证
|
||||
}
|
||||
}
|
||||
|
||||
###操作值:设置、读取和删除
|
||||
### 操作值:设置、读取和删除
|
||||
SessionStart函数返回的是一个满足Session接口的变量,那么我们该如何用他来对session数据进行操作呢?
|
||||
|
||||
上面的例子中的代码`session.Get("uid")`已经展示了基本的读取数据的操作,现在我们再来看一下详细的操作:
|
||||
@@ -171,7 +171,7 @@ SessionStart函数返回的是一个满足Session接口的变量,那么我们
|
||||
|
||||
因为Session有过期的概念,所以我们定义了GC操作,当访问过期时间满足GC的触发条件后将会引起GC,但是当我们进行了任意一个session操作,都会对Session实体进行更新,都会触发对最后访问时间的修改,这样当GC的时候就不会误删除还在使用的Session实体。
|
||||
|
||||
###session重置
|
||||
### session重置
|
||||
我们知道,Web应用中有用户退出这个操作,那么当用户退出应用的时候,我们需要对该用户的session数据进行销毁操作,上面的代码已经演示了如何使用session重置操作,下面这个函数就是实现了这个功能:
|
||||
|
||||
//Destroy sessionid
|
||||
@@ -190,7 +190,7 @@ SessionStart函数返回的是一个满足Session接口的变量,那么我们
|
||||
}
|
||||
|
||||
|
||||
###session销毁
|
||||
### session销毁
|
||||
我们来看一下Session管理器如何来管理销毁,只要我们在Main启动的时候启动:
|
||||
|
||||
func init() {
|
||||
@@ -206,7 +206,7 @@ SessionStart函数返回的是一个满足Session接口的变量,那么我们
|
||||
|
||||
我们可以看到GC充分利用了time包中的定时器功能,当超时`maxLifeTime`之后调用GC函数,这样就可以保证`maxLifeTime`时间内的session都是可用的,类似的方案也可以用于统计在线用户数之类的。
|
||||
|
||||
##总结
|
||||
## 总结
|
||||
至此 我们实现了一个用来在Web应用中全局管理Session的SessionManager,定义了用来提供Session存储实现Provider的接口,下一小节,我们将会通过接口定义来实现一些Provider,供大家参考学习。
|
||||
|
||||
## links
|
||||
|
||||
Reference in New Issue
Block a user