diff --git a/main.go b/main.go index b5ad535..a1cca34 100644 --- a/main.go +++ b/main.go @@ -20,13 +20,12 @@ func main() { //全局运行的上下文 rest.CONTEXT.Init() defer rest.CONTEXT.Destroy() - - http.Handle("/", rest.CONTEXT.Router) - dotPort := fmt.Sprintf(":%v", rest.CONFIG.ServerPort) + http.Handle("/", rest.CONTEXT.Router) rest.LOGGER.Info("App started at http://localhost:%v", rest.CONFIG.ServerPort) + dotPort := fmt.Sprintf(":%v", rest.CONFIG.ServerPort) err1 := http.ListenAndServe(dotPort, nil) if err1 != nil { log.Fatal("ListenAndServe: ", err1) diff --git a/rest/base_controller.go b/rest/base_controller.go index 873f4dd..9044d25 100644 --- a/rest/base_controller.go +++ b/rest/base_controller.go @@ -98,16 +98,20 @@ func (this *BaseController) Wrap(f func(writer http.ResponseWriter, request *htt } } -//返回成功的结果。 +//返回成功的结果。支持放置三种类型 1.字符串 2. WebResult对象 3.空指针 4.任意类型 func (this *BaseController) Success(data interface{}) *WebResult { var webResult *WebResult = nil if value, ok := data.(string); ok { + //返回一句普通的消息 webResult = &WebResult{Code: CODE_WRAPPER_OK.Code, Msg: value} } else if value, ok := data.(*WebResult); ok { + //返回一个webResult对象 webResult = value } else if _, ok := data.(types.Nil); ok { + //返回一个空指针 webResult = ConstWebResult(CODE_WRAPPER_OK) } else { + //返回的类型不明确。 webResult = &WebResult{Code: CODE_WRAPPER_OK.Code, Data: data} } return webResult @@ -130,49 +134,6 @@ func (this *BaseController) Error(err interface{}) *WebResult { return webResult } -//能找到一个user就找到一个 -func (this *BaseController) findUser(writer http.ResponseWriter, request *http.Request) *User { - - //验证用户是否已经登录。 - sessionCookie, err := request.Cookie(COOKIE_AUTH_KEY) - if err != nil { - this.logger.Warn("获取用户cookie信息失败啦~") - return nil - } - - sessionId := sessionCookie.Value - - this.logger.Info("findUser sessionId = %s", sessionId) - - //去缓存中捞取看看 - cacheItem, err := CONTEXT.SessionCache.Value(sessionId) - if err != nil { - this.logger.Warn("获取缓存时出错了" + err.Error()) - return nil - } - - if cacheItem.Data() == nil { - this.logger.Warn("cache item中已经不存在了 " + err.Error()) - return nil - } - - if value, ok := cacheItem.Data().(*User); ok { - return value - } else { - this.logger.Error("cache item中的类型不是*User ") - } - - return nil -} - -func (this *BaseController) checkUser(writer http.ResponseWriter, request *http.Request) *User { - if this.findUser(writer, request) == nil { - panic(ConstWebResult(CODE_WRAPPER_LOGIN)) - } else { - return this.findUser(writer, request) - } -} - //允许跨域请求 func (this *BaseController) allowCORS(writer http.ResponseWriter) { writer.Header().Add("Access-Control-Allow-Origin", "*") diff --git a/rest/bean.go b/rest/bean.go index f65f1b8..522aabf 100644 --- a/rest/bean.go +++ b/rest/bean.go @@ -29,3 +29,45 @@ func (this *Bean) PanicError(err error) { func (this *Bean) PanicWebError(msg string, httpStatusCode int) { panic(&WebError{Msg: msg, Code: httpStatusCode}) } + +//能找到一个user就找到一个 +func (this *Bean) findUser(writer http.ResponseWriter, request *http.Request) *User { + + //验证用户是否已经登录。 + sessionCookie, err := request.Cookie(COOKIE_AUTH_KEY) + if err != nil { + this.logger.Warn("cookie 信息不存在~") + return nil + } + + sessionId := sessionCookie.Value + + //去缓存中捞取看看 + cacheItem, err := CONTEXT.SessionCache.Value(sessionId) + if err != nil { + this.logger.Warn("获取缓存时出错了" + err.Error()) + return nil + } + + if cacheItem == nil || cacheItem.Data() == nil { + this.logger.Warn("cache item中已经不存在了 ") + return nil + } + + if value, ok := cacheItem.Data().(*User); ok { + return value + } else { + this.logger.Error("cache item中的类型不是*User ") + } + + return nil +} + +//获取当前登录的用户,找不到就返回登录错误 +func (this *Bean) checkUser(writer http.ResponseWriter, request *http.Request) *User { + if this.findUser(writer, request) == nil { + panic(ConstWebResult(CODE_WRAPPER_LOGIN)) + } else { + return this.findUser(writer, request) + } +} diff --git a/rest/config.go b/rest/config.go index 13e42dd..c73dd7d 100644 --- a/rest/config.go +++ b/rest/config.go @@ -150,7 +150,7 @@ func LoadConfigFromFile() { filePath := GetConfPath() + "/tank.json" content, err := ioutil.ReadFile(filePath) if err != nil { - LOGGER.Warn(fmt.Sprintf("无法找到配置文件:%s,错误:%v\n将使用config.go中的默认配置项。", filePath, err)) + LOGGER.Warn("无法找到配置文件:%s 将使用config.go中的默认配置项。", filePath) } else { // 用 json.Unmarshal err := json.Unmarshal(content, CONFIG) @@ -170,7 +170,7 @@ func LoadConfigFromEnvironment() { if e == nil { CONFIG.ServerPort = i } else { - LOGGER.Panic(fmt.Sprintf("环境变量TANK_SERVER_PORT必须为整数!%v", tmpServerPort)) + LOGGER.Panic("环境变量TANK_SERVER_PORT必须为整数!%v", tmpServerPort) } } @@ -185,7 +185,7 @@ func LoadConfigFromEnvironment() { if e == nil { CONFIG.MysqlPort = i } else { - LOGGER.Panic(fmt.Sprintf("环境变量TANK_MYSQL_PORT必须为整数!%v", tmpMysqlPort)) + LOGGER.Panic("环境变量TANK_MYSQL_PORT必须为整数!%v", tmpMysqlPort) } } diff --git a/rest/footprint_model.go b/rest/footprint_model.go index 7a7fef1..337d413 100644 --- a/rest/footprint_model.go +++ b/rest/footprint_model.go @@ -5,7 +5,6 @@ package rest */ type Footprint struct { Base - SessionId string `json:"sessionId"` UserUuid string `json:"userUuid"` Ip string `json:"ip"` Host string `json:"host"` diff --git a/rest/footprint_service.go b/rest/footprint_service.go index 5c319a7..f406dd8 100644 --- a/rest/footprint_service.go +++ b/rest/footprint_service.go @@ -2,15 +2,15 @@ package rest import ( "encoding/json" - "fmt" "net/http" + "time" ) //@Service type FootprintService struct { Bean footprintDao *FootprintDao - userDao *UserDao + userDao *UserDao } //初始化方法 @@ -38,23 +38,8 @@ func (this *FootprintService) Detail(uuid string) *Footprint { return footprint } - - //记录访问记录 -func (this *FootprintService) Trace(writer http.ResponseWriter, request *http.Request) { - //手动装填本实例的Bean. 这里必须要用中间变量方可。 - var footprintDao *FootprintDao - b := CONTEXT.GetBean(footprintDao) - if b, ok := b.(*FootprintDao); ok { - footprintDao = b - } - - fmt.Printf("Host = %s Uri = %s Path = %s RawPath = %s RawQuery = %s \n", - request.Host, - request.RequestURI, - request.URL.Path, - request.URL.RawPath, - request.URL.RawQuery) +func (this *FootprintService) Trace(writer http.ResponseWriter, request *http.Request, duration time.Duration, success bool) { params := make(map[string][]string) @@ -76,18 +61,23 @@ func (this *FootprintService) Trace(writer http.ResponseWriter, request *http.Re paramsString = string(paramsData) } - //将文件信息存入数据库中。 - footprint := &Footprint{ - SessionId: "", - UserUuid: "testUserUUid", - Ip: GetIpAddress(request), - Host: request.Host, - Uri: request.URL.Path, - Params: paramsString, - Cost: 0, - Success: true, + user := this.findUser(writer, request) + userUuid := "" + if user != nil { + userUuid = user.Uuid } - footprint = footprintDao.Create(footprint) + //将文件信息存入数据库中。 + footprint := &Footprint{ + UserUuid: userUuid, + Ip: GetIpAddress(request), + Host: request.Host, + Uri: request.URL.Path, + Params: paramsString, + Cost: int64(duration / time.Millisecond), + Success: success, + } + + footprint = this.footprintDao.Create(footprint) } diff --git a/rest/logger.go b/rest/logger.go index c645925..c0ec792 100644 --- a/rest/logger.go +++ b/rest/logger.go @@ -32,11 +32,11 @@ func (this *Logger) Debug(format string, v ...interface{}) { } func (this *Logger) Info(format string, v ...interface{}) { - this.log("[info]", format, v...) + this.log("[info ]", format, v...) } func (this *Logger) Warn(format string, v ...interface{}) { - this.log("[warn]", format, v...) + this.log("[warn ]", format, v...) } func (this *Logger) Error(format string, v ...interface{}) { diff --git a/rest/router.go b/rest/router.go index eeac4da..13fdd54 100644 --- a/rest/router.go +++ b/rest/router.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "strings" + "time" ) //用于处理所有前来的请求 @@ -46,7 +47,7 @@ func NewRouter() *Router { } //全局的异常捕获 -func (this *Router) GlobalPanicHandler(writer http.ResponseWriter, request *http.Request) { +func (this *Router) GlobalPanicHandler(writer http.ResponseWriter, request *http.Request, startTime time.Time) { if err := recover(); err != nil { LOGGER.Error(fmt.Sprintf("全局异常: %v", err)) @@ -85,6 +86,9 @@ func (this *Router) GlobalPanicHandler(writer http.ResponseWriter, request *http var json = jsoniter.ConfigCompatibleWithStandardLibrary b, _ := json.Marshal(webResult) + //错误情况记录。 + go this.footprintService.Trace(writer, request, time.Now().Sub(startTime), false) + _, err := fmt.Fprintf(writer, string(b)) if err != nil { fmt.Printf("输出结果时出错了\n") @@ -95,9 +99,11 @@ func (this *Router) GlobalPanicHandler(writer http.ResponseWriter, request *http //让Router具有处理请求的功能。 func (this *Router) ServeHTTP(writer http.ResponseWriter, request *http.Request) { + startTime := time.Now() + //每个请求的入口在这里 //全局异常处理。 - defer this.GlobalPanicHandler(writer, request) + defer this.GlobalPanicHandler(writer, request, startTime) path := request.URL.Path if strings.HasPrefix(path, "/api") { @@ -128,7 +134,7 @@ func (this *Router) ServeHTTP(writer http.ResponseWriter, request *http.Request) } //正常的访问记录会落到这里。 - go this.footprintService.Trace(writer, request) + go this.footprintService.Trace(writer, request, time.Now().Sub(startTime), true) } else { //当作静态资源处理。默认从当前文件下面的static文件夹中取东西。 diff --git a/rest/user_controller.go b/rest/user_controller.go index 041cf70..f9c1f7b 100644 --- a/rest/user_controller.go +++ b/rest/user_controller.go @@ -62,9 +62,9 @@ func (this *UserController) Login(writer http.ResponseWriter, request *http.Requ } } - //登录成功,设置Cookie。有效期7天。 + //登录成功,设置Cookie。有效期30天。 expiration := time.Now() - expiration = expiration.AddDate(0, 0, 7) + expiration = expiration.AddDate(0, 0, 30) //持久化用户的session. session := &Session{ diff --git a/rest/user_service.go b/rest/user_service.go index 8a1ef6b..76fb72c 100644 --- a/rest/user_service.go +++ b/rest/user_service.go @@ -44,8 +44,6 @@ func (this *UserService) bootstrap(writer http.ResponseWriter, request *http.Req sessionId := sessionCookie.Value - this.logger.Info("请求的sessionId = " + sessionId) - //去缓存中捞取 cacheItem, err := CONTEXT.SessionCache.Value(sessionId) if err != nil { @@ -64,7 +62,6 @@ func (this *UserService) bootstrap(writer http.ResponseWriter, request *http.Req if user != nil { //将用户装填进缓存中 CONTEXT.SessionCache.Add(sessionCookie.Value, duration, user) - } else { this.logger.Error("没有找到对应的user " + session.UserUuid) }