防重复提交的重要性?
在业务开发中,为什么我们要去想办法解决重复提交这一问题发生?网上的概念很多:导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机,那么为什么会造成这种现象?前台操作的抖动,快速操作,网络通信或者后端响应慢,都会增加后端重复处理的概率,就拿我亲身经历来说,因为业务逻辑,需要进行一个”关注”操作,但是写好业务之后在测试时连续点击几下,重复地进行关注和取消关注操作,因为操作过于频繁,而服务器走过来的响应速度没有那么快地进行处理,导致重复数据插入地情况,最后导致在查询关注的时候服务器报错,这个时候,放重复提交就显得很重要了
如何防重复提交?
其实实现地方法有很多,但是原理大概都是相通的,我选择的是通过使用AOP+redis来进行处理,前端发起请求的时候需要在请求头里将token给我,然后我这边通过token+ip再加上请求的路径作为一个key存到redis里面去,设置一个合适的过期时间,下一次再从redis中取出和当前时间进行一个判断,如果大于我们设定的一个超时时间,那么就进行拦截,不让它进行下面的业务代码,并给出提示“操作频繁,请稍后重试”
代码实现
前提环境准备:SpringAOP的支持,Redis的支持
其实用文字叙述出来感觉有一点点绕,但是代码实现起来其实不难
首先我们需要自定义一个注解:
1 | package com.ifueen.anntion; |
然后写一个AOP进行拦截处理
1 | package com.ifueen.aspect; |
AOP和注解都写好了,现在只需要在要用到的请求上面打上这个注解就可以了
其他请求需要进行防重复提交,也只需要打上这个注解即可