/
response.go
93 lines (77 loc) · 2.32 KB
/
response.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package web
import (
"net/http"
"github.com/spf13/viper"
"github.com/1024casts/snake/pkg/conf"
"github.com/1024casts/snake/pkg/errno"
"github.com/1024casts/snake/pkg/flash"
"github.com/1024casts/snake/pkg/log"
"github.com/gin-gonic/gin"
"github.com/gorilla/sessions"
)
// Resp web response struct
type Resp struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data"`
}
// Response json response
func Response(c *gin.Context, err error, data interface{}) {
code, message := errno.DecodeErr(err)
// always return http.StatusOK
c.JSON(http.StatusOK, Resp{
Code: code,
Message: message,
Data: data,
})
}
// Redirect redirect to another path
func Redirect(c *gin.Context, redirectPath, errMsg string) {
flash.SetMessage(c.Writer, errMsg)
c.Redirect(http.StatusMovedPermanently, redirectPath)
c.Abort()
}
// Store It is recommended to use an authentication key with 32 or 64 bytes.
// The encryption key, if set, must be either 16, 24, or 32 bytes to select
// AES-128, AES-192, or AES-256 modes.
var Store = sessions.NewCookieStore([]byte(viper.GetString("cookie.secret")))
// SetLoginCookie set login cookie to session
func SetLoginCookie(ctx *gin.Context, userID uint64) {
Store.Options.HttpOnly = true
session := GetCookieSession(ctx)
session.Options = &sessions.Options{
Domain: conf.Conf.Cookie.Domain,
MaxAge: 86400,
Path: "/",
HttpOnly: true,
}
// 浏览器关闭,cookie删除,否则保存30天(github.com/gorilla/sessions 包的默认值)
val := ctx.DefaultPostForm("remember_me", "0")
log.Infof("[handler] remember_me val: %s", val)
if val == "1" {
session.Options.MaxAge = 86400 * 30
}
session.Values["user_id"] = userID
req := Request(ctx)
resp := ResponseWriter(ctx)
err := session.Save(req, resp)
if err != nil {
log.Warnf("[handler] set login cookie, %v", err)
}
}
// GetCookieSession get cookie
func GetCookieSession(ctx *gin.Context) *sessions.Session {
session, err := Store.Get(ctx.Request, conf.Conf.Cookie.Name)
if err != nil {
log.Warnf("[handler] store get err, %v", err)
}
return session
}
// Request return a request
func Request(ctx *gin.Context) *http.Request {
return ctx.Request
}
// ResponseWriter return a response writer
func ResponseWriter(ctx *gin.Context) http.ResponseWriter {
return ctx.Writer
}