关于gin开发中后置中间键的疑问
⚠️登录逻辑返回了err,也使用了c.Abort()和return进行终止逻辑,但是仍然会继续执行签发中间键,这时为什么呢?
项目地址:github.com/infoBrainSys/peony (开发中)
- 逻辑是,登录校验成功则继续中间键签发Token,如果不成功则不执行后续中间键逻辑。
Router
index.POST("/login", middleware.IssueToken, controller.Login)
Login
// Login 登录逻辑
func Login(c *gin.Context) {
base := logic.NewBaseContext(c)
var loginReq v1.LoginReq
if err := base.Ctx.ShouldBind(&loginReq); err != nil {
base.AbortAndReturn(http.StatusBadRequest, err)
return
}
if err := service.User().Login(c, &loginReq); err != nil {
base.AbortAndReturn(http.StatusBadRequest, err)
base.Ctx.Abort()
return
}
return
// 登录成功逻辑在 IssueToken 后置中间键中执行
}
Middleware
func IssueToken(c *gin.Context) {
base := logic.NewBaseContext(c)
base.Ctx.Next()
email, err := utils.RDB.Get(base.Ctx, "email").Result()
if err != nil {
base.AbortAndReturn(http.StatusBadRequest, err)
}
if email == "" {
base.AbortAndReturn(http.StatusInternalServerError, errors.New("redis 中不存在 email, token签发失败"))
}
tokenStr, err := service.JWT().IssueToken(email)
// 将 token 写入 redis,判断 token 是否存在 redis 中,如果存在则这个 token 有效
defer utils.RDB.Set(
base.Ctx,
email+tokenStr, // token key 构造方式: email+token
tokenStr,
time.Second*time.Duration(utils.V.GetInt64("jwt.exp")),
)
if err != nil {
base.To(base.Ctx.Request.RequestURI).
AbortAndReturn(http.StatusInternalServerError, err).
Redirect()
}
base.To("/").Response(http.StatusOK, consts.Success, tokenStr, consts.LoginSuccess).Redirect()
}
推荐文章: