gin框架 gin.Context中的Abort方法使用注意事项 - gin框架中立刻中断当前请求的方法

gin框架上下文中的Abort序列方法(Abort,AbortWithStatus, AbortWithStatusJSON,AbortWithError他们都不会立刻终止当前的请求,在中间件中调用Abort方法后中间件中的后续的代码会被继续执行,但是中间件后面的handler控制器方法会被终止执行(在中间件中调用Abort以确保不会调用此请求的其余处理程序)。

gin立刻中断当前请求的2种方法

  • 1. Abort + return 终止当前请求

如果需要立刻终止当前请求需要使用 Abort + return 来终止后面的代码块和后续业务逻辑的执行, 注意必须是abort序列方法+return组合才能终止带去代码的执行。

如: 

if req.File == nil {
	c.AbortWithStatusJSON(-1, gin.H{"msg": "请选择需要上传的文件"})
	return
}

上面的c.Abort会终止gin框架继续调用后面的请求逻辑, return 会立刻终止当前代码块的执行, 必须是他们的组合才能彻底终止当前的请求,只return,他只会终止当前代码块后续代码的执行,而不会终止gin的后续处理逻辑执行。

  • 2. 直接抛 panic异常

这个是golang程序中最霸道,最直接,最彻底的终止当前请求的方法!!  由于他过于霸道,所以建议大家慎用!

panic("不玩了,直接退出!")

另外还有一个os提供的函数  os.Exit(1)  这个是直接退出当前应用程序,这个大家要分清楚,不要乱用哦

中间件中使用 c.Abort()

在中间件中使用 c.Abort() 后,当前路由对应的控制器就不会被执行; 

如:

有如下的路由信息

rga := r.Group("")

rga.Use(middleware.Auth) // 在rga中使用了Auth中间件

rga.POST("/file", controller.File.Upload)  // 路由绑定

中间件中,如果使用了 Abort方法,则    controller.File.Upload 这个控制器就不会被执行

func Auth(c *gin.Context) {
	var uid int = 0
	if uid == 0 {
		c.Redirect(301, "/login") // 跳转
		c.Abort() // 使用了Abort
	}
	c.Next() // 这个会被执行
}

  上面的中间件中的代码 在Abort方法后面的代码都会被执行,但是上面的路由对应的handler不会被执行;  如果我们在上面的中间件中没有使用Abort方法 , 则路由对应的handler就会被执行,这里的中间件就失效了!!  而且c.Redirect这个跳转也没用,只有使用了Abort方法后Redirect才生效。

在handler控制器中使用Abort方法

如果是在控制器handler中执行 c.Abort() , 则后面的代码会被继续执行,如果想要终止当前请求,则必须使用空 return 来终止后面的代码的执行, 如:

下面代码中我们使用了 c.AbortWithStatusJSON 方法,后面必须跟着一个空的 return,  否则后面的代码会被继续执行


func (a *cFile) Upload(c *gin.Context) {
	req := &dto.InfoFileUploadReq{}
	c.ShouldBind(req) //
	
	if req.File == nil {
		c.AbortWithStatusJSON(-1, gin.H{"msg": myerror.NewCode(mycode.CodeMissingParameter, "请选择需要上传的文件")})
        return
	}
	_, err := service.InfoFileSvc().Upload(c, model.InfoFileUploadInput{
		File:       req.File,
		RandomName: true,
		Ref:        req.Ref,
		CategoryId: req.CategoryId,
	})
	if err != nil {
		c.AbortWithStatusJSON(-1, gin.H{"msg": err.Error()})
		return
	}
	res := &dto.InfoFileUploadRes{
		Name: "yyy",
		Url:  "aaa",
	}
	c.JSON(200, res)
}

c.Abort方法原型

Abort可防止调用挂起的处理程序。请注意,这不会停止当前处理程序。
假设您有一个授权中间件来验证当前请求是否已被授权。
如果授权失败(例如:密码不匹配),请调用Abort以确保不会调用此请求的其余处理程序。

// Abort prevents pending handlers from being called. Note that this will not stop the current handler.
// Let's say you have an authorization middleware that validates that the current request is authorized.
// If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers
// for this request are not called.
func (c *Context) Abort() {
	c.index = abortIndex
}

abort序列方法

总结: gin框架中的终止当前请求的方式还是很有特点的,他必须是 Abort +return组合 或者直接抛panic异常。 gin中的Abort是很具有迷惑性的,大家要搞明白,gin中的Abort他是用于确保不会调用当前请求的其余处理程序,而不是立即中断当前请求!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/766770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子价签能够给零售业带来哪些效益?

在竞争激烈的零售市场中,每一个细微的优化都可能成为吸引顾客和提升效率的关键。随着技术的不断进步,电子价签作为一种革新性的解决方案,正以其独特的优势重新定义零售运营的标准。那它到底能给我们的零售门店带来哪些实际效益? …

Qt时间日期处理与定时器使用总结

一、日期时间数据 1.QTime 用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下: //注:秒(s)和毫秒(ms)有默认值0 QTime::QTime(int h, int m, int s 0, int ms 0) 若无须初始化时间数据,可…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现,Vivado的安装请看下面的文章,这里我只是安装了一个标准版本,只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

Linux shell编程学习笔记61: pstree 命令——显示进程树

0 前言 在 Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令https://blog.csdn.net/Purpleendurer/article/details/139696466?spm1001.2014.3001.5501 中我们研究了ps命令。在Linux中,通过ps命令&am…

Perl语言入门指南

一、绪论 1.1 Perl语言概述 1.2 Perl的特色 1.3 Perl面临的问题 1.4 Perl语言的应用领域 二、Perl语言基础 2.1 Perl语言的历史发展 2.2 Perl语言的基本语法 2.3 Perl语言的数据类型 三、Perl语言控制结构 3.1 条件语句 3.2 循环结构 3.3 函数和子程序 四、Perl语…

RK3568驱动指南|第十五篇 I2C-第183章 SMBus总线介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

电脑版微信自动发送微信消息给好友或者群聊

一.软件下载 点击微信自动发送消息下载 二.相关使用方法 1.打开软件,输入想自动发送的内容 2.确保登录了微信电脑版【PC端】,然后切换到想要自动发送的好友或群聊的窗口。 3.点击开始,现在自动发送即可,稍等三秒程序自动运行。 …

小程序开发平台版源码系统——万能门店小程序功能 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在移动互联网的浪潮中,小程序以其轻量、便捷、无需下载即可使用的特点,迅速成为连接用户与商家的新桥梁。为了满足广大商家快速搭建个性化、高效运营的小程序需求,我们精心打造了“小程序开发平台版源码系统——万能门店小程序功能…

秋招——MySQL补充——MySQL是如何加行级锁

文章目录 引言正文什么SQL语句会加行级锁查询操作增加对应的行级锁事务的写法 update和delete修改操作也会增加行级锁 行级锁有哪些种类记录锁间隙锁Next-Key锁 MySQL是如何加行级锁?唯一索引等值查询查询记录是存在的查询记录是不存在的 唯一索引范围查找针对大于或…

【python脚本】批量检测sql延时注入

文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术,当传统的基于错误信息或数据回显的注入方法不可行时,例如当Web应用进行了安全配置,不显示任何错误信息或敏感数据时&#x…

Element中的消息提示组件Message和弹框组件MessageBox

简述:在 Element UI 中,Message和MessageBox都是比较常用的组件,Message用来提示消息,而MessageBox是一个用于创建模态对话框的组件。它可以用于在页面上快速展示信息、警告或错误提示,而不会阻止用户的其他操作。简单…

Pandas_DataFrame读写详解:案例解析(第24天)

系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、 读写文…

华为DCN之:SDN和NFV

1. SDN概述 1.1 SDN的起源 SDN(Software Defined Network)即软件定义网络。是由斯坦福大学Clean Slate研究组提出的一种新型网络创新架构。其核心理念通过将网络设备控制平面与数据平面分离,从而实现了网络控制平面的集中控制,为…

深入理解C++中的锁

目录 1.基本互斥锁(std::mutex) 2.递归互斥锁(std::recursive_mutex) 3.带超时机制的互斥锁(std::timed_mutex) 4.带超时机制的递归互斥锁(std::recursive_timed_mutex) 5.共享…

图解 Kafka 架构

写在前面 Kafka 是一个可横向扩展,高可靠的实时消息中间件,常用于服务解耦、流量削峰。 好像是 LinkedIn 团队开发的,后面捐赠给apache基金会了。 kafka 总体架构图 Producer:生产者,消息的产生者,是消息的…

android AIDL使用demo

背景 最近打算学习一下如何在framework层添加一个自定义service。 了解到自定义service需要使用aidl,为了加强对aidl的了解和使用过程,特意又温习了一下aidl的使用,并用博客的形式记录下来。 aidl官方参考:https://developer.and…

不同系统间数据交换要通过 api 不能直接数据库访问

很多大数据开发提供数据给外部系统直接给表结构,这是不好的方式。在不同系统间进行数据交换时,通过API(应用程序编程接口)而非直接访问数据库是现代系统集成的一种最佳实践。 目录 为什么要通过API进行数据交换如何通过API进行数据…

论文辅导 | 基于多尺度分解的LSTM⁃ARIMA锂电池寿命预测

辅导文章 模型描述 锂电池剩余使用寿命(Remaining useful life,RUL)预测是锂电池研究的一个重要方向,通过对RUL的准确预测,可以更好地管理和维护电池,延长电池使用寿命。为了能够准确预测锂电池的RUL&…

STM32 看门狗 HAL

由时钟图可以看出看门狗采用的是内部低速时钟,频率为40KHz 打开看门狗,采用32分频,计数1250。 结合设置的分频系数和重载计数值,我们可以计算出看门狗的定时时间: 32*1250/40kHz 1s 主函数中喂狗就行 HAL_IWDG_Ref…

STM32 HAL库读取ID

在stm32f1xx_hal.c文件中由读取ID号的子函数,不同单片机的UID_BASE不同,本单片机用的是STM32F103CBT6,跳转之后可以看到地址为:0x1FFFF7E8 在程序中只需定义一个数组调用读取ID的函数即可 uint32_t UID[3]; while(1) { UID[0] HAL_GetUIDw0…