国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

深圳做網(wǎng)站 信科網(wǎng)絡(luò)seo研究中心學(xué)員案例

深圳做網(wǎng)站 信科網(wǎng)絡(luò),seo研究中心學(xué)員案例,初創(chuàng)企業(yè)網(wǎng)站建設(shè)流程,讓別人做網(wǎng)站需要提供什么一、啥是防抖 所謂防抖,一是防用戶手抖,二是防網(wǎng)絡(luò)抖動(dòng)。在Web系統(tǒng)中,表單提交是一個(gè)非常常見(jiàn)的功能,如果不加控制,容易因?yàn)橛脩舻恼`操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請(qǐng)求被發(fā)送多次,進(jìn)而生成重復(fù)的數(shù)據(jù)記錄。要針…

一、啥是防抖
?

所謂防抖,一是防用戶手抖,二是防網(wǎng)絡(luò)抖動(dòng)。在Web系統(tǒng)中,表單提交是一個(gè)非常常見(jiàn)的功能,如果不加控制,容易因?yàn)橛脩舻恼`操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請(qǐng)求被發(fā)送多次,進(jìn)而生成重復(fù)的數(shù)據(jù)記錄。要針對(duì)用戶的誤操作,前端通常會(huì)實(shí)現(xiàn)按鈕的loading狀態(tài),阻止用戶進(jìn)行多次點(diǎn)擊。而對(duì)于網(wǎng)絡(luò)波動(dòng)造成的請(qǐng)求重發(fā)問(wèn)題,僅靠前端是不行的。為此,后端也應(yīng)實(shí)施相應(yīng)的防抖邏輯,確保在網(wǎng)絡(luò)波動(dòng)的情況下不會(huì)接收并處理同一請(qǐng)求多次。

一個(gè)理想的防抖組件或機(jī)制,我覺(jué)得應(yīng)該具備以下特點(diǎn):

邏輯正確,也就是不能誤判;

響應(yīng)迅速,不能太慢;

易于集成,邏輯與業(yè)務(wù)解耦;

良好的用戶反饋機(jī)制,比如提示“您點(diǎn)擊的太快了”

二、思路解析
前面講了那么多,我們已經(jīng)知道接口的防抖是很有必要的了,但是在開(kāi)發(fā)之前,我們需要捋清楚幾個(gè)問(wèn)題。

2.1.哪一類接口需要防抖?
接口防抖也不是每個(gè)接口都需要加,一般需要加防抖的接口有這幾類:

用戶輸入類接口:比如搜索框輸入、表單輸入等,用戶輸入往往會(huì)頻繁觸發(fā)接口請(qǐng)求,但是每次觸發(fā)并不一定需要立即發(fā)送請(qǐng)求,可以等待用戶完成輸入一段時(shí)間后再發(fā)送請(qǐng)求。

按鈕點(diǎn)擊類接口:比如提交表單、保存設(shè)置等,用戶可能會(huì)頻繁點(diǎn)擊按鈕,但是每次點(diǎn)擊并不一定需要立即發(fā)送請(qǐng)求,可以等待用戶停止點(diǎn)擊一段時(shí)間后再發(fā)送請(qǐng)求。

滾動(dòng)加載類接口:比如下拉刷新、上拉加載更多等,用戶可能在滾動(dòng)過(guò)程中頻繁觸發(fā)接口請(qǐng)求,但是每次觸發(fā)并不一定需要立即發(fā)送請(qǐng)求,可以等待用戶停止?jié)L動(dòng)一段時(shí)間后再發(fā)送請(qǐng)求。

2.2.如何確定接口是重復(fù)的?
防抖也即防重復(fù)提交,那么如何確定兩次接口就是重復(fù)的呢?首先,我們需要給這兩次接口的調(diào)用加一個(gè)時(shí)間間隔,大于這個(gè)時(shí)間間隔的一定不是重復(fù)提交;其次,兩次請(qǐng)求提交的參數(shù)比對(duì),不一定要全部參數(shù),選擇標(biāo)識(shí)性強(qiáng)的參數(shù)即可;最后,如果想做的更好一點(diǎn),還可以加一個(gè)請(qǐng)求地址的對(duì)比。

  • 定義一個(gè)RequestLock,配置超時(shí)時(shí)間、異常消息、分組標(biāo)識(shí)(用戶標(biāo)識(shí))
/*** 請(qǐng)求鎖,防止重復(fù)提交** @author xt*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestLock {/*** 過(guò)期時(shí)間** @return*/long expire() default 3;/*** 異常提示** @return*/String message() default "您的操作太快了,請(qǐng)稍后重試";/*** 參數(shù)分隔符** @return*/String delimiter() default "|";/*** 時(shí)間單位** @return*/TimeUnit timeUnit() default TimeUnit.SECONDS;/*** 前綴(從請(qǐng)求header key)** @return*/String group() default "loginuserid";
}

  • 定義一個(gè)aspect 實(shí)現(xiàn)對(duì)注解RequestLock的endpoint進(jìn)行攔截
@EnableAspectJAutoProxy
@Aspect
@Configuration
@Order
public class RequestLockAspect {@Resourceprivate RedisTemplate redisTemplate;@Pointcut("execution(public * * (..)) && @annotation(org.xt.shisui.redis.duplicate.RequestLock)")public void endpointPointcut() {}@Around("endpointPointcut()")public Object interceptor(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method method = methodSignature.getMethod();RequestLock requestLock = method.getAnnotation(RequestLock.class);if (redisTemplate != null) {String key = RequestLockKeyGenerator.getLockKey(joinPoint);Boolean success = redisTemplate.opsForValue().setIfAbsent(key, new byte[0], requestLock.expire(), requestLock.timeUnit());if (Boolean.FALSE.equals(success)) {return Response.no(requestLock.message());}}return joinPoint.proceed();}
}
  • 根據(jù)請(qǐng)求參數(shù)構(gòu)建RequestLock鎖的key,即Redis存儲(chǔ)的key

/*** 根據(jù)請(qǐng)求參數(shù)構(gòu)建鎖的key** @author xt* @date 2022-07-15 14:21*/
public class RequestLockKeyGenerator {public static String getLockKey(ProceedingJoinPoint joinPoint) {String ipAddress = null, group = null;ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();//方法名稱String methodName = signature.getName();//類路徑String declaringTypeName = signature.getDeclaringTypeName();RequestLock requestLock = method.getAnnotation(RequestLock.class);if (attributes != null) {//加上請(qǐng)求中的ip和分組標(biāo)識(shí),防止錯(cuò)誤攔截HttpServletRequest request = attributes.getRequest();ipAddress = request.getRemoteAddr();group = request.getHeader(requestLock.group());}final Object[] args = joinPoint.getArgs();final Parameter[] parameters = method.getParameters();StringBuilder params = new StringBuilder();String delimiter = requestLock.delimiter();for (int i = 0; i < parameters.length; i++) {//忽略特殊參數(shù),如圖片、大文本等,如果是存hashcode 可以不需要這個(gè)注解final RequestLockKeyIgnore keyIgnore = parameters[i].getAnnotation(RequestLockKeyIgnore.class);if (keyIgnore != null) {continue;}Object arg = args[i];if (arg != null) {params.append(delimiter).append(arg);}}StringBuilder result = new StringBuilder();result.append(declaringTypeName).append(delimiter).append(methodName).append(delimiter).append(ipAddress).append(delimiter).append(delimiter).append(group).append(params.hashCode());return result.toString();}
}

  • 如果Redis存儲(chǔ)請(qǐng)求參數(shù)字符串,可以增加特殊參數(shù)忽略注解,如圖片等屬性,建議用hashcode
/*** 忽略該參數(shù),防止一些base64字符串被當(dāng)做主鍵** @author xt* @date 2022-01-05 14:37*/
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface RequestLockKeyIgnore {
}
  • 具體使用demo
    @RequestLock(expire = 5)@ApiOperation("新增")@RequestMapping(value = "/create", method = RequestMethod.POST)public Response<ChatSpeechcraftCategoryCreateResp> create(@RequestBody @Validated ChatSpeechcraftCategoryCreateReq req, final HttpServletRequest request) throws SimpleException {return chatSpeechcraftCategoryApiService.create(req);}

http://aloenet.com.cn/news/46868.html

相關(guān)文章:

  • 中國(guó)建行網(wǎng)站北京seo公司排名
  • wordpress幻燈片名seo搜索引擎優(yōu)化實(shí)訓(xùn)
  • C語(yǔ)言網(wǎng)站開(kāi)發(fā)pdf抖音矩陣排名軟件seo
  • 南京網(wǎng)站開(kāi)發(fā)培訓(xùn)鄭州做網(wǎng)絡(luò)優(yōu)化的公司
  • 如何制作網(wǎng)站app重慶森林電影
  • 重慶政府a(chǎn)pp渝快辦深圳債務(wù)優(yōu)化公司
  • 網(wǎng)站制作要花多少錢百度一下百度網(wǎng)站
  • 旅游電子商務(wù)的三創(chuàng)賽網(wǎng)站建設(shè)鳳山網(wǎng)站seo
  • 鵬牛網(wǎng)做網(wǎng)站怎么樣章魚(yú)磁力鏈接引擎
  • H5網(wǎng)站建設(shè)報(bào)價(jià)多少網(wǎng)絡(luò)營(yíng)銷推廣系統(tǒng)
  • 交互設(shè)計(jì)包含網(wǎng)站設(shè)計(jì)長(zhǎng)清區(qū)seo網(wǎng)絡(luò)優(yōu)化軟件
  • 做網(wǎng)站時(shí) 404網(wǎng)頁(yè)如何指向作品推廣
  • 網(wǎng)站那個(gè)做的比較好html+css網(wǎng)頁(yè)制作成品
  • 用源代碼做網(wǎng)站2020國(guó)內(nèi)十大小說(shuō)網(wǎng)站排名
  • 什么是門戶網(wǎng)站廣告我想自己建立一個(gè)網(wǎng)站
  • 動(dòng)畫畢業(yè)設(shè)計(jì)代做網(wǎng)站鄭州百度網(wǎng)站優(yōu)化排名
  • 圖片類網(wǎng)站建設(shè)百度推廣年費(fèi)多少錢
  • 搜索引擎網(wǎng)站有哪些windows優(yōu)化大師是哪個(gè)公司的
  • 電子商務(wù)網(wǎng)站建設(shè)問(wèn)題百度游戲app下載
  • 怎么用視頻做網(wǎng)站背景重慶seo優(yōu)化公司
  • 東營(yíng)做網(wǎng)站優(yōu)化的公司軟文廣告案例
  • 杭州網(wǎng)站建設(shè)公司官網(wǎng)頁(yè)面設(shè)計(jì)漂亮的網(wǎng)站
  • 武漢單位做網(wǎng)站網(wǎng)站建設(shè)優(yōu)化400報(bào)價(jià)
  • wordpress使用手機(jī)號(hào)登錄上海網(wǎng)站seoseodian
  • 現(xiàn)在建一個(gè)網(wǎng)站一年費(fèi)用只要幾百元南寧百度首頁(yè)優(yōu)化
  • 金華市網(wǎng)站建設(shè)seo網(wǎng)絡(luò)推廣方法
  • 手機(jī)網(wǎng)站如何制作免費(fèi)百度云網(wǎng)盤資源分享網(wǎng)站
  • 一屏展示網(wǎng)站咸寧網(wǎng)站seo
  • 真正永久免費(fèi)網(wǎng)絡(luò)電話seo搜索引擎優(yōu)化原理
  • 網(wǎng)站開(kāi)發(fā)教程 模板媒體公關(guān)