炫舞时代,go言语网络编程之session的完成-特斯拉推动态刹车灯功能,避免因紧急刹车造成追尾,特斯拉技术新闻

知乎精选 admin 2019-05-16 232 次浏览 0个评论
网站分享代码

网络编程中cookie和session是必不可少的,今日就简略说一下go言语对session的完结。炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻

图片来源于网络

cookie,简而言之便是在本地计测名算机保存一些用户操作的前史信息(当然包含登录信息),并在用户再次拜访该站点时浏览器经过HTTP协议将本地cookie内容发送给服务器,然后完结验证,或继续上一步操作。

session在Web开发环境下,它的意义是指一类用来在客户端与服务器端之间坚持状况的处理方案。有时候Session也用来指这种处理方案的存储结构。

简而言之,cookie是唐雎不辱使命本地的文件,存储一下和服务器相关的内容,session的服务端存储的数据,用来和cookie彼此对应,简化用户登录等,由于http都是无状况的,在用户登录后,再拜访其他页面时不应该再次登录,所以能够运用cookie和session来处理,咱们不可能每一次拜访界面都要将用户的账号密码等信息都发送一次,这样不仅是做无用功,并且也很风险。

下面是我用go言语完结的一个简略的session:

package main
import (
"crypto/rand"
"encoding/bas炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻e64"
"errors"
"io"
"net/http"
"net/url"
"strconv"
"sync"
"time"
)
// SessionMgr sess炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻ion manager
type SessionMgr struct {
cookieName string
mLock sync.RWMutex
maxLifeTime int64
sessions map[string]*Session
}
// Session
type Session struct {
sessionID string
lastTime time.Time
values map[interface{}]inte女性裸rface{}
}
// NewSessionMgr create session manager
func NewSessionMgr(cookieName s杉果游戏tring, maxLifeTime int64)北欧神话 *SessionMgr {
mgr := &SessionMgr{cookieName: cookieName, maxLifeTime: maxLifeTime, sessions: make(map[string]*Session)}
go mgr.Sess炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻ionGC()
return mgr
}
// NewSession create session
func (mgr *SessionMgr) NewSession(w http.ResponseWriter, r *http.Request) string {
mgr.mLock.Lock()
defer mgr.mLock.Unlock()
newSessionID := url.QueryEscape(mgr.NewSessionID())
session := &Session{sessionID: newSessionID, lastTime: time.Now(),
values: make(map[interface{}]interface{})}
mgr.sessions[newSessionID] = session
cookie := http.Cookie{Name: mgr.cookieName, Value: newSessionID,
Path: "/", HttpOnly: true, MaxAge: int(mgr.maxLifeTime)}
http.SetCookie(w, &cookie)
return newSessionID
}
// EndSession
func (mgr *SessionMgr) EndSession(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie(mgr.cookieName)
if err != nil || cookie.Value == "" {
return
}
mgr.mLock.Lock()
defer mgr.mLock.Unlock()
delete(mgr.sessions, cookie.Value)
newCookie := http.Cookie{Name: mgr.cookieName,
Path: "/", HttpOnly: true,
Expires: time.Now(), MaxAge: -1}
http.SetCookie(w, &newCookie)
}
// EndSessionByID end the se猎豹wifission by session ID
func (mgr *SessionMgr) EndSessionByID(sessionID string) {
mgr.mLock.Lock()
defer mgr.mLock.Unlock()
delete(mgr.sessions, sessionID)
}
// SetSessionValue set value fo session
func (mgr *SessionMgr) SetSessionValue(sessionID string, key interface{}, value interface{}) error {
mgr.m蒋大为状告五环之歌Lock.Lock()
defer mgr.mLock.Unlock()
if session, ok 小攀鱼坊:= mgr.sessions[sessionID]; ok {
session.values[key] = 籽岷value
return nil
}
return errors.New("invalid session ID")
}
// GetSessionValue get value fo session
func (mgr *SessionMgr) Get百家讲坛全集SessionValue(sessionID string, key interface{}) (inte很rface{}, error) {
mgr.mLock.RLock()
defer mgr.mLock.RUnlock()
if session, ok := mgr.sessions[sessionID]; ok {
if val, ok := session.values[key]; ok {
return val, nil
}
}
return nil, errors.New("invalid session ID")
}
//CheckCookieValid check cookie is valid or炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻 not
func (mgr *SessionMgr) CheckCookieValid(w http.ResponseWriter, r *http.Request) (string, error) {
cookie, err := r.Cookie(mgr.cookieName)
if cookie == nil ||
err != nil {
return "", err
}
mgr.mLock.Lock()
defer mgr.mLock.Unlock()
sessionID := cookie.Value
if session, ok := mgr.sessions[sessionID]恬妮; ok {
session.lastTime = time.Now()
return sessionID, nil
}
return "", errors.New("invalid session ID")炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻
}
// SessionGC maintain session
func (mgr *SessionMgr) SessionGC() {
mgr.mLock.Lock()
defer mgr.mLock.Unlock()
for id, session := range mgr.sessions {
if session.lastTime.Unix()+mgr.max花惠生LifeTime < time.Now().Unix() {
delete(mgr.sessions, id)
}
}
time.AfterFunc(time.Duration(mgr.maxLif新年旅行eTime)*time.Se彩泥cond, func() {
mgr.SessionGC()
})
}
// NewSessionID generate unique ID
func (mgr *SessionMgr) NewSessionID() string {
b := make([]byte, 32)
if _, err := io.RSaivianeadFull(rand.Reader, b); err != nil {
nano := time.Now().UnixNano()
return strconv.FormatInt(nano, 10)
}
return base64.URLEncoding.EncodeToString(b)
}

(头条对代码的支撑让人头疼,咱们能够去大众号检查)

这儿咱们有一个session办理者和一个session结构体,咱们能够创立session,并且生成大局仅有的sessionID,并且设置session的存活时刻,和上一次登录的时刻,相同,咱们也能够炸毁一个session。这样,当有恳求过来时,咱们炫舞年代,go言语网络编程之session的完结-特斯拉推动态刹车灯功用,防止因紧迫刹车形成追尾,特斯拉技能新闻能够喝酒游戏依据恳求中的cookie的值,找到对应友谊的语句的sessionID,然后找到对应的session。就能够判别这个登录是否有用了。

目前市场上有许多go web的结构,里边都完结了session,当然结构中的完结要比我写的这个完善的多,可是我这个主要是协助咱们加深对web中session的了解,这样即便今后咱们看结构的源码时,看到session这部分也不会生疏,并且了解速度也会更快。

首要有一个session 食管炎manager,用来办理session,在创立sessionmgr一起,创立一个协程,用来办理session是否有用,既SessionGC()。假如有每隔一段时刻判别一切session是否有过期的,有则删除去。然后咱们有NewSession和EndSession办法,用来创立session和完毕一个session,一起能够将session的关于信息传给cookie。咱们还能够对session设置值,依据不同的事务需求,咱们能够对每一个session存储一些特定的值,这儿咱们运用一个map来存储。还有一个重要的接口便是CheckCookieValid()。有了恳求之后,咱们能够判别发送过来的cookie的数据是否正确,这儿咱们以为cookie中的value便是sessionID,假如依据sessionID找到对应的session,就阐明有用,一起更新session的last time信息。假如没有则回来过错。

这个是十分简略的,假如咱们需求自己动手写session,能够参阅这个,可是有许多细节都需求依据实际情况来处理,期望咱们都能够见机行事,活学活用。

后续会有更多的形式和算法以及区块链相关的,假如你是想学习go言语或许是对规划形式或许算法感兴趣亦或是区块链开发工作者,都能够重视一下。(微信大众号:Go言语之美,更多go言语常识信息等)。大众号会继续为咱们共享更多干货。