首页 > 编程知识 正文

spring boot编程思想,springboot菜鸟教程

时间:2023-05-05 21:38:03 阅读:144235 作者:1587

由于重复提交表单会生成脏数据,因此代码中在后端处理的原理如下

客户端只需在每个请求中唯一识别token,在后端阻止请求,将token标头作为redis缓存的key请求参数设置为value,设置redis过期时间,然后在每个请求中比较redis的缓存数据。 (如果没有token,可以将接口url用作密钥。)

自定义注释: RepeatSubmit.java

package com.example.demo.repeat; import java.lang.annotation.*; /** *自定义注释重复提交* @ author hk */@ inherited @ target (element type.method ) retentionpolicy.runtime

@ componentpublicabstractclassrepeatsubmitinterceptorimplementshandlerinterceptor { @ overridepublicbooleanprehandle (https erer e,对象处理程序(throws exception (if ) HandlerinstanceofHandlermethod ) handlermethodhandlermeethod method=handler method repeatsubmitannotation=method.get annotation (repeat submit.class; IF (注释!=null () if(this.isrepeatsubmit ) (request ) ) /不能返回客户端并重复提交返回假; } }返回真; } else { return true; } } /** *子类实现具体的防重复提交的规则* * @ param request * @ return * @ throws exception */publicabstractbooleanisrepeatsubmit

@ componentpublicclasssameurldatainterceptorextendsrepeatsubmitinterceptor { @ autowiredprivaterediscacherediscache; publicfinalstringrepeat _ params=' repeat params '; publicfinalstringrepeat _ time=' repeat time '; /**间隔时间,单位:秒默认10秒**2次要求相同参数,如果间隔时间大于此参数,系统不认定重复提交的数据*/privatefinalintintervaltime=10; @ overridepublicbooleanisrepeatsubmit (httpservletrequestrequest )//获取请求参数(这里只写了获取url连接的参数)。 有关body参数的信息,请参见https://blog.csdn.net/weixin _ 43882514/article/details/115626176 ) stringnowparams=JSON object . nowdatamap.put(repeat_params,nowParams ); nowdatamap.put(repeat_time,System.currentTimeMillis (); string URL=request.getrequest uri (; //唯一值(没有可以使用请求地址的标头)//stringsubmitkey=request.get header (header ); 字符串提交密钥=URL,作为存储cache的密钥值; //唯一标识符(指定密钥标头) string cache _ repeat _ key=' repeat _ submit : ' submit key; objectsessionobj=redis cache.getcache object (cache _ repeat _ key ); 会话对象!=null () { MapString,Objectsessionmap=(mapstring,object ) sessionObj; if(sessionmap.containskey(URL )、{ MapString,Objectpredatamap=) { MapString,object } session map.get ) URL ); if (比较参数(新数据映射,预数据映射)比较时间(新数据映射,预数据映射) ) {返回真; } } } MapString,objectcachemap=newhashmapstring,object (; cachemap.put(URL,nowDataMap; redis cache.setcacheobject (cache _ repeat _ key,cacheMap,intervalTime,TimeUnit.SECONDS ); 返回假; } /** *确定参数是否相同的*/privatebooleancompareparams (mapstring、Object nowMap、mapstring、Object preMap ) stringnowpapare returnnowparams.equals (pre params ); } /** *次间隔*/privatebooleancomparetime (mapstring,Object nowMap,mapstring,Object preMap ) longtime1=) long (Nong ) if () time1-time2) this.intervalTime * 1000 ) ) { return true; }返回假; }在需要验证重发的接口上加上@RepeatSubmit注释即可

@postmapping(/testpost ) @ repeatsubmitpublicstringtestpost ) @requestbodyuseruser ) { return 'test; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。