Token生成器

首先需要调用StartGameServer启动一个计时器

/**
服务器
*/
package util

import (
	"time"
)

//服务器全局对象
var Server _serverVO

func StartGameServer() {
	//启动服务器自身的计时器与维护
	Server = _serverVO{}
	Server.TimeSec = time.Now().Unix()
	Server.LocalPath = GetCurrentDirectory()
	ticker := time.NewTicker(1 * time.Second)
	go func() {
		for _ = range ticker.C {
			Server.TimeSec = time.Now().Unix()
			Server.GoTime++
		}
	}()
	//初始化token获取器
	InitTokenSession()
	Log("开启服务器时间计时器", "Token获取器")
}

type _serverVO struct {
	TimeSec   int64  //当前系统时间秒
	GoTime    int64  //当前系统已经运行了多久时间了
	LocalPath string //当前系统的运行目录
}

//获取当前系统的毫秒时间
func (this *_serverVO) TimeMillisec() int64 {
	return time.Now().UnixNano() / 1000000
}

//获取当前系统的纳秒时间
func (this *_serverVO) TimeMicro() int64 {
	return time.Now().UnixNano() / 1000
}

之后就可以调用该文件中的各种应用函数了

//token
package util

import (
	"bytes"
	"strconv"
	"sync"
)

var TokenSession *tokenSession

//初始化InitTokenSession
func InitTokenSession() {
	TokenSession = &tokenSession{lastString: strconv.FormatInt(Server.TimeSec, 10), lastServerTime: Server.TimeSec, addTime: 0, pj: "_"}
}

//全局token获取器
type tokenSession struct {
	lastString     string
	lastServerTime int64
	addTime        int64
	buffer         bytes.Buffer
	pj             string
	sync.Mutex
}

//获取一个轻量级的Token,不经过md5,主要在程序内部使用
func (this *tokenSession) GetTokenLite() string {
	this.Mutex.Lock()
	defer this.Mutex.Unlock()
	if Server.TimeSec != this.lastServerTime {
		this.addTime = 0
		this.lastServerTime = Server.TimeSec
		this.lastString = strconv.FormatInt(this.lastServerTime, 10)
	} else {
		this.addTime++
	}
	this.buffer.Reset()
	this.buffer.WriteString(this.lastString)
	this.buffer.WriteString(this.pj)
	this.buffer.WriteString(strconv.FormatInt(this.addTime, 10))
	return this.buffer.String()
}

//获取一个完整的Token,经过md5
func (this *tokenSession) GetTokenMax() string {
	str := this.GetTokenLite()
	return MD5Hex(str)
}

//获取一个私有的token,经过md5
func (this *tokenSession) GetTokenPrivate(v interface{}) string {
	str := strconv.FormatInt(this.lastServerTime, 10) + this.pj
	switch v.(type) {
	case string:
		str = str + v.(string)
	case int:
		str = str + strconv.Itoa(v.(int))
	case int64:
		str = str + strconv.FormatInt(v.(int64), 10)
	case uint:
		str = str + strconv.FormatUint(uint64(v.(uint)), 10)
	}
	return MD5Hex(str)
}
方法中用到了sync,本人接触不久不知道是否有什么安全的又不需要加锁的方法?
阅读更多

没有更多推荐了,返回首页