中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > 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ò)抖動。在Web系統(tǒng)中,表單提交是一個非常常見的功能,如果不加控制,容易因為用戶的誤操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請求被發(fā)送多次,進(jìn)而生成重復(fù)的數(shù)據(jù)記錄。要針…

一、啥是防抖
?

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 定義一個aspect 實現(xiàn)對注解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ù)請求參數(shù)構(gòu)建RequestLock鎖的key,即Redis存儲的key

/*** 根據(jù)請求參數(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) {//加上請求中的ip和分組標(biāo)識,防止錯誤攔截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 可以不需要這個注解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存儲請求參數(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://www.risenshineclean.com/news/46868.html

相關(guān)文章:

  • 中國建行網(wǎng)站北京seo公司排名
  • wordpress幻燈片名seo搜索引擎優(yōu)化實訓(xùn)
  • C語言網(wǎng)站開發(fā)pdf抖音矩陣排名軟件seo
  • 南京網(wǎng)站開發(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)站怎么樣章魚磁力鏈接引擎
  • H5網(wǎng)站建設(shè)報價多少網(wǎng)絡(luò)營銷推廣系統(tǒng)
  • 交互設(shè)計包含網(wǎng)站設(shè)計長清區(qū)seo網(wǎng)絡(luò)優(yōu)化軟件
  • 做網(wǎng)站時 404網(wǎng)頁如何指向作品推廣
  • 網(wǎng)站那個做的比較好html+css網(wǎng)頁制作成品
  • 用源代碼做網(wǎng)站2020國內(nèi)十大小說網(wǎng)站排名
  • 什么是門戶網(wǎng)站廣告我想自己建立一個網(wǎng)站
  • 動畫畢業(yè)設(shè)計代做網(wǎng)站鄭州百度網(wǎng)站優(yōu)化排名
  • 圖片類網(wǎng)站建設(shè)百度推廣年費(fèi)多少錢
  • 搜索引擎網(wǎng)站有哪些windows優(yōu)化大師是哪個公司的
  • 電子商務(wù)網(wǎng)站建設(shè)問題百度游戲app下載
  • 怎么用視頻做網(wǎng)站背景重慶seo優(yōu)化公司
  • 東營做網(wǎng)站優(yōu)化的公司軟文廣告案例
  • 杭州網(wǎng)站建設(shè)公司官網(wǎng)頁面設(shè)計漂亮的網(wǎng)站
  • 武漢單位做網(wǎng)站網(wǎng)站建設(shè)優(yōu)化400報價
  • wordpress使用手機(jī)號登錄上海網(wǎng)站seoseodian
  • 現(xiàn)在建一個網(wǎng)站一年費(fèi)用只要幾百元南寧百度首頁優(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)站開發(fā)教程 模板媒體公關(guān)