func M1() gin.HandlerFunc { return func(c *gin.Context) { token := c.Request.Header.Get("token") // 判空 if token == "" { c.JSON(http.StatusUnauthorized, gin.H{ "status": -1, "msg": "请求未携带token,无权限访问", }) c.Abort() return } // 判断token有效性 claims, err := service.ParseToken(token) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{ "status": -1, "msg": err.Error(), }) c.Abort() return } // 取 userID userID := claims.Data.(string) fmt.Println(userID) }
时间: 2024-04-28 20:19:52 浏览: 14
这是一个使用 Gin 框架编写的中间件函数 M1,主要用于验证请求的 token 是否有效。当请求未携带 token 或 token 无效时,该函数会返回一个 JSON 格式的错误信息,并中断后续处理流程。如果 token 有效,则可以从中提取出用户的身份信息,这里是 userID,并在后续的处理中使用该信息。
相关问题
gin框架中c.abort()作用,和return区别 c.abort
在 Golang 中,Gin 框架提供了 `Abort` 方法和 `return` 语句来终止请求的处理过程,它们的区别如下:
- `Abort` 方法会终止当前请求的处理过程,并不再执行后续的处理函数;而 `return` 语句只会终止当前处理函数的执行,但不会终止整个请求的处理过程,后续的处理函数仍然会被执行。
- `Abort` 方法会将请求的处理结果立即返回给客户端,不再执行后续的处理函数;而 `return` 语句只是直接返回了处理函数的返回值,后续的处理函数仍然会被执行,直到请求处理完毕才将结果返回给客户端。
在实际开发中,我们通常使用 `Abort` 方法来终止请求的处理过程,因为它可以立即返回结果给客户端,避免了不必要的处理,提高了性能。
下面是一个使用 `Abort` 方法的例子:
```go
func TokenAuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.Request.Header.Get("Authorization")
if token == "" {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Authorization token not found"})
return
}
// 验证 token 是否有效,这里假设有效
c.Next()
}
}
```
在上面的代码中,当请求头中的 Authorization 字段为空时,我们使用 `AbortWithStatusJSON` 方法终止请求处理过程,并返回 401 错误给客户端。
需要注意的是,当使用 `Abort` 方法时,我们需要确保已经向客户端返回了结果,否则客户端可能会一直等待,产生超时等问题。
return func(c *gin.Context) { origin := c.Request.Header.Get("origin") //请求头部 if len(origin) == 0 { origin = c.Request.Header.Get("Origin") } //接收客户端发送的origin (重要!) c.Writer.Header().Set("Access-Control-Allow-Origin", origin) //允许客户端传递校验信息比如 cookie (重要) c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") //服务器支持的所有跨域请求的方法 c.Writer.Header().Set("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE, UPDATE") c.Writer.Header().Set("Content-Type", "application/json; charset=utf-8") // 设置预验请求有效期为 86400 秒 c.Writer.Header().Set("Access-Control-Max-Age", "86400") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }
使用 CSRF token 可以比较安全地传递校验信息。CSRF token 是一种防止跨站请求伪造攻击的技术,其原理是在服务器端生成一个随机字符串(token),并将其放入登录用户的 session 中,然后将该 token 发送给客户端,客户端每次请求时需要将该 token 一并发送给服务器,服务器验证该 token 是否与用户 session 中的一致,从而确定该请求是否有效。这样即使攻击者在客户端伪造请求,由于没有正确的 CSRF token,服务器会拒绝该请求。