首页> 中国专利> 一种基于Spring的防止重复访问Restful API的方法

一种基于Spring的防止重复访问Restful API的方法

摘要

本发明公开了一种基于Spring的防止重复访问Restful API的方法,包括:S1,定义防止重复访问的注解,并定义其有效标记,S2,继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类以定义拦截器;重写preHandle方法,以在请求前实现拦截验证;并在拦截器定义用于存储请求数据的缓存对象;S3,在需要防止重复访问的API接口使用@DuplicateSubmitToken添加注解,激活防止重复访问功能。本发明使用注解激活验证的方式,可以自由控制API是否需要防止重复访问功能,更灵活地处理各API验证需求。

著录项

  • 公开/公告号CN112597486A

    专利类型发明专利

  • 公开/公告日2021-04-02

    原文格式PDF

  • 申请/专利权人 广东广宇科技发展有限公司;

    申请/专利号CN202011548725.6

  • 申请日2020-12-24

  • 分类号G06F21/52(20130101);G06F9/448(20180101);G06F8/30(20180101);

  • 代理机构44245 广州市华学知识产权代理有限公司;

  • 代理人雷芬芬;梁莹

  • 地址 528251 广东省佛山市南海区桂城街平西上海村东平路北侧瀚天科技城B区产业区3号楼十一楼1105-1110单元

  • 入库时间 2023-06-19 10:27:30

说明书

技术领域

本发明涉及Restful API访问技术领域,具体涉及一种基于Spring的防止重复访问Restful API的方法。

背景技术

近年来,随着前后端分离思想的兴起,Restful API的使用越来越广泛。然而在前端调用后端的过程中,发现Restful API都有可能会被重复请求。譬如人为主动连续点击前端功能,或者因鼠标性能问题导致的前端功能重复触发。无论是人为或者无意,都会导致在短时间内重复请求Restful API,而这些操作对于系统来说,都是认为是不可控的操作。特别一些对数据有修改的Restful API,譬如表单添加功能,重复请求极可能会出现多条重复的数据;甚至一些操作重要数据的功能,极其有可能令系统出现不可控的问题。

上述问题主要体现在前端触发重复请求,对于前端技术的解决方案,可以通过控制功能按钮来实现防重复请求。具体的,可以在用户点击了按钮后,通过JS把功能按钮的disabled属性改成true(灰色,不可能点击),然后再发送请求,待请求返回,再把功能按钮的disabled属性改成false(正常颜色,可点击)。但是这种解决方案是基于前端技术的,只能解决通过前端页面请求Restful API的问题,实际上Restful API是可以通过任何的HTTP/HTTPS协议访问的,那么这些避开使用前端页面的请求就不能得到控制。

因此,行业内急需研发一种无论是因为设备问题(鼠标按键)或者是人为主观意识操作都能够防止Restful API请求错误重复访问的方法。

发明内容

本发明的目的是为了克服以上现有技术存在的不足,提供了一种基于Spring的防止重复访问Restful API的方法。

本发明的目的通过以下的技术方案实现:

一种基于Spring的防止重复访问Restful API的方法,包括:

S1,定义防止重复访问的注解,并定义其有效标记,

S2,继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类以定义拦截器;重写preHandle方法,以在请求前实现拦截验证;并在拦截器定义用于存储请求数据的缓存对象;

S3,在需要防止重复访问的API接口使用@DuplicateSubmitToken添加注解,激活防止重复访问功能。

优选地,在步骤S2中,定义缓存对象使用谷歌的com.google.common.cache缓存组件实现,设置缓存对象在1秒后自动清除。

优选地,重写preHandle方法包括:

S21,判断preHandle的参数handler对像是否属于org.springframework.web.method.HandlerMethod的子类或接口;若是,则执行步骤S22,若否,则跳过重复访问拦截验证逻辑并且进入下一个拦截器;

S22,从参数handler获取重复访问的注解对象,将注解对象强制转换成HandlerMethod对象;并从参数handler获取防止重复访问的注解对象的DuplicateSubmitToken对象,判断其是否有效标记,若有,则执行步骤S23,若否,则跳过重复访问拦截验证逻辑并且进入下一个拦截器;

S23,若从客服端发送的请求Header包含用户访问令牌TOKEN,则取出用户访问令牌TOKEN作为验证对象;如果没有,则取出请求机器的IP作为验证对象;

S24,获取当前请求标识。

S25,根据访问令牌TOKEN或者请求机器的IP从缓存对象获取缓存请求,若没有获取到缓存请求或者获取的请求标识和当前请求标识不一致,则把客户端过来的请求Header与对应的请求标识添加到缓存对象;若获取的请求标识和当前请求标识一致,则响应请求方,完成验证逻辑;

S26,调用父类的preHandle方法进入下一个拦截器。

优选地,步骤S24包括:从HandlerMethod对象获取当前请求标识,请求标识请求类名和方法名信息。

优选地,步骤S25包括:响应请求方“1秒内请不要重复请求!”

优选地,在步骤S26,待完成所有拦截器的验证逻辑后,在拦截器加上@Component注解,让加上注解的拦截器在系统启动时自动创建,并由Spring管理。

优选地,有效标记为true。

本发明相对于现有技术具有如下优点:

本发明预先定义防止重复访问的注解,并定义其有效标记,然后继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类以定义拦截器,根据访问令牌TOKEN或者请求机器的IP从缓存对象获取缓存请求,若没有获取到缓存请求或者获取的请求标识和当前请求标识不一致,则把客户端过来的请求Header与对应的请求标识添加到缓存对象;若获取的请求标识和当前请求标识一致,则响应请求方,完成验证逻辑;最后在拦截器加上@Component注解,让加上注解的拦截器在系统启动时自动创建,并由Spring管理,这种使用注解激活验证的方式,可以自由控制API是否需要防止重复访问功能,更灵活地处理各API验证需求。另一方面,因为防止重复访问功能并不是所有API都需要的,例如一些查询的功能,因此需要实现防止重复访问激活注解,让每个API选择按需使用此功能。

附图说明

构成本申请的一部分的说明书附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为本发明的基于Spring的防止重复访问Restful API的方法的流程示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步说明。

参见图1,一种基于Spring的防止重复访问Restful API的方法,包括:

S1,定义防止重复访问的注解,并定义其有效标记,有效标记为true。此注解用于激活API的防止重复访问功能。代码如下:

S2,继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类以定义拦截器;重写preHandle方法,以在请求前实现拦截验证;并在拦截器定义用于存储请求数据的缓存对象;定义缓存对象使用谷歌的com.google.common.cache缓存组件实现,设置缓存对象在1秒后自动清除。

在本实施例,继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类以定义拦截器;重写preHandle方法,以在请求前实现拦截验证都是实现拦截器的步骤,首先创建一个HandlerInterceptorAdapter的子类,这个类就是需要创建的拦截器,作为HandlerInterceptorAdapter的子类,它有preHandle、postHandle、afterCompletion三个方法可以重写。preHandle会在处理请求前被执行;postHandle会在处理请求后被执行;afterCompletion会在响应请求后被执行,这三个方法只要返回值为true,则该请求马上被拦截,后面的业务逻辑均不会被执行。而我们的需求是在处理请求前执行拦截逻辑,所以需要重写postHandle方法,把拦截逻辑代码放在里面,如果拦截逻辑判断为这是一个重复访问的请求,则返回true把请求拦截。而定义缓存对象则是创建一个缓存空间,用来储存请求相关信息,而这些信息则是用来支持是否拦截请求的逻辑判断。其中重写preHandle方法包括:

S21,判断preHandle的参数handler对像是否属于org.springframework.web.method.HandlerMethod的子类或接口;若是,则执行步骤S22,若否,则跳过重复访问拦截验证逻辑并且进入下一个拦截器;

S22,从参数handler获取重复访问的注解对象,将注解对象强制转换成HandlerMethod对象;并从参数handler获取防止重复访问的注解对象的DuplicateSubmitToken对象,判断其是否有效标记,若有,则执行步骤S23,若否,则跳过重复访问拦截验证逻辑并且进入下一个拦截器;

S23,若从客服端发送的请求Header包含用户访问令牌TOKEN,则取出用户访问令牌TOKEN作为验证对象;如果没有,则取出请求机器的IP作为验证对象;

S24,获取当前请求标识。具体地,从HandlerMethod对象获取当前请求标识,请求标识请求类名和方法名信息。

S25,根据访问令牌TOKEN或者请求机器的IP从缓存对象获取缓存请求,若没有获取到缓存请求或者获取的请求标识和当前请求标识不一致,则把客户端过来的请求Header与对应的请求标识添加到缓存对象;若获取的请求标识和当前请求标识一致,则响应请求方“1秒内请不要重复请求!”,完成验证逻辑;

通过依赖Spring的拦截器实现,在系统内存保存一个1秒的请求缓存标记,利用该标记判断出重复的请求并忽略,从而达到1秒内相同用户(机器)只能访问一次的效果,让Restful API更好的实现,解决Restful API现有技术的缺陷,避免无意的重复请求导致系统出现不可控问题。

S26,调用父类的preHandle方法进入下一个拦截器。

在步骤S26,待完成所有拦截器的验证逻辑后,在拦截器加上@Component注解,让加上注解的拦截器在系统启动时自动创建,并由Spring管理。Spring为一个框架。

其中,步骤S2为使用Spring拦截器实现防止重复访问的功能。拦截器实现代码如下:

S3,在需要防止重复访问的API接口使用@DuplicateSubmitToken添加注解,激活防止重复访问功能。示例代码如下:

综上,本申请首先对DuplicateSubmitToke注解类先定义,只有定义了这个类,后面才能使用这个类。它的作用就是让拦截器知道那些方法需要被拦截。其次在拦截器实现验证业务,这里会根据判断该请求方法上是否存在@DuplicateSubmitToke这个注解,如果存在,则认为该方法应该被拦截,如果不存在,则认为该方法不被拦截。最后,就是使用,这里的描述指的是在一个方法上面手工添加@DuplicateSubmitToke这个注解,让拦截器认为这个方法是被拦截的,从而进行后面的拦截判断逻辑。本申请解决了Restful API请求错误重复访问的问题,无论是因为设备问题(鼠标按键)或者是人为主观意识操作,都可以支持,有效保证系统的数据完整性。同时,使用注解激活验证的方式,可以自由控制API是否需要防止重复访问功能,更灵活地处理各API验证需求。再者,按照拦截器加注解激活的这种设计模式,还可以扩展各种拦截器不同的验证逻辑与注解,横向扩展验证每个Restful API请求错误访问的功能。

上述具体实施方式为本发明的优选实施例,并不能对本发明进行限定,其他的任何未背离本发明的技术方案而所做的改变或其它等效的置换方式,都包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号