关于gin开发中后置中间键的疑问

⚠️登录逻辑返回了err,也使用了c.Abort()和return进行终止逻辑,但是仍然会继续执行签发中间键,这时为什么呢?

项目地址:github.com/infoBrainSys/peony (开发中)

  • 逻辑是,登录校验成功则继续中间键签发Token,如果不成功则不执行后续中间键逻辑。

Go

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()
}
gin
最佳答案

file 如果这个图片看不明白的话,你需要阅读Gin的责任链模式以及Gin的Handlers构成了。总的来说是运行优先的问题还有函数递归调用的问题。

9个月前 评论
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前
讨论数量: 17

file 如果这个图片看不明白的话,你需要阅读Gin的责任链模式以及Gin的Handlers构成了。总的来说是运行优先的问题还有函数递归调用的问题。

9个月前 评论
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前

按你的想法的话,如果这里想要实现你的功能,需要把IssueToken这个方法放在路由处理函数之后

9个月前 评论
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前
Scrooge (楼主) 9个月前
Scrooge (楼主) 9个月前
mengxin666 (作者) 9个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!