帝王绿,qq图片-汽车行业巨变前夜,汽车行业发展

网络编程中cookie和session是必不可少的,今日就简略说一下go言语对session的完结。

图片来源于网络

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

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

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

下面是我用go言语完结的一个简帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展单佟达宁的session:

package main
import (
"crypto/rand"
"encoding/base64"
"errors"
"io"胜狮场站提单号查询
"net/http"
"net/url"
"strconv"
"sync"
"time"
)
// SessionMgr session manager
type SessionMgr struct {
cookieName string
mLock sync.RWMutex
maxLifeTime int64
sessio帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展ns map[string]*Session
}
// Session
type Session struct {
sessionID string
lastTime time.Time
values map[interface{}]interface{}
}
// NewSessionMgr creat昆虫有哪些e session manager
func NewSessionMgr(cookieName string, maxLifeTime int64) *SessionMgr {
mgr := &SessionMgr{cookieName: cookieName, maxLifeTime: maxLifeTime, sessions中文翻译英文: make河南移动网上营业厅(m缺点ap[string]*Session)}
go mgr.SessionGC()
return mgr
}
// NewSession 江望兵create帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展 session
func (mgr *Sessio帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展nMgr) NewSession(w http.ResponseWriter, r *http.Request) string {
mgr.mLock重生缘来是你txt.Lock()
defer mgr.mLock.Unlock()
newSessionID := url.Qu帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展eryEscape(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.Coo帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展kie(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.cookieNamdynamice,
Path: "/", HttpOnly: true,
Expires: time.Now(), MaxAge: -1}
http.SetCookie(w, 微波炉哪个牌子好&newCookie)
}
// EndSessionByID end the session by session ID
func (mgr *SessionMgr) EndSessionBy甲乙丙丁戊己庚辛壬癸ID(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.mLock.Lock()
defer mgr.mLock.Unlock()
if session, ok := mgr.sessions[sessionID]; ok {
session.values[key] = value
return nil
}
return erro找一夜情rs.New("invalid session ID")
}
// GetSessionValue get value fo session
func (mgr *SessionMgr) GetSessionValue(sessionID string, key interface{}) (interface{}, 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 not
func (mgr *SessionMgr) CheckCookieValid(w http.ResponseWrit帝王绿,qq图片-汽车行业剧变前夜,汽车行业开展er, r *http.Request) (string, error) {
coo黑马kie, 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")
}
// 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.maxLifeTime < time.Now().Unix() {
delete(mgr.sessions, id)
}
}
time.AfterFunc(time.Duration(mgr.maxLifeTime)*time.Second, func() {
mgr.SessionGC()
})
}
// NewSessionID generate unique ID
func (mgr *SessionMgr) NewSessionID() string {
b := make([]byte, 32)
if _, err := io.ReadFull(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。这样,当有恳求过来时,咱们能够依据恳求中的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()。有了恳求之后,咱们能够判别发送过阎维文夫妻情mv视频来的cookie的数据是否正确,这儿咱们以为cookie中的value便是sessionID,假如依据sessionID找到对应的session,就阐明有用,一起更新session的last time信息。假如没有则回来过错。

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

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

 关键词: