form表單用js提前執行函數若不成功則不提交_面試必會的重復提交 8 種解決方案!...

重復提交看似是一個小兒科的問題,但卻存在好幾種變種用法。在面試中回答的好,說不定會有意想不到的收獲!現把這 8 種解決方案分享給大家!

1.什么是冪等

6cb83a18916b7ca350891da29d604366.png在我們編程中常見冪等
  • select查詢天然冪等
  • delete刪除也是冪等,刪除同一個多次效果一樣
  • update直接更新某個值的,冪等
  • update更新累加操作的,非冪等
  • insert非冪等操作,每次新增一條

2.產生原因

由于重復點擊或者網絡重發 eg:
  • 點擊提交按鈕兩次;
  • 點擊刷新按鈕;
  • 使用瀏覽器后退按鈕重復之前的操作,導致重復提交表單;
  • 使用瀏覽器歷史記錄重復提交表單;
  • 瀏覽器重復的HTTP請;
  • nginx重發等情況;
  • 分布式RPC的try重發等;

3.解決方案

1)前端js提交禁止按鈕可以用一些js組件2)使用Post/Redirect/Get模式在提交后執行頁面重定向,這就是所謂的Post-Redirect-Get (PRG)模式。簡言之,當用戶提交了表單后,你去執行一個客戶端的重定向,轉到提交成功信息頁面。這能避免用戶按F5導致的重復提交,而其也不會出現瀏覽器表單重復提交的警告,也能消除按瀏覽器前進和后退按導致的同樣問題。3)在session中存放一個特殊標志在服務器端,生成一個唯一的標識符,將它存入session,同時將它寫入表單的隱藏字段中,然后將表單頁面發給瀏覽器,用戶錄入信息后點擊提交,在服務器端,獲取表單中隱藏字段的值,與session中的唯一標識符比較,相等說明是首次提交,就處理本次請求,然后將session中的唯一標識符移除;不相等說明是重復提交,就不再處理。4)其他借助使用header頭設置緩存控制頭Cache-control等方式比較復雜 不適合移動端APP的應用 這里不詳解5)借助數據庫insert使用唯一索引 update使用 樂觀鎖 version版本法這種在大數據量和高并發下效率依賴數據庫硬件能力,可針對非核心業務6)借助悲觀鎖使用select … for update ,這種和 synchronized 鎖住先查再insert or update一樣,但要避免死鎖,效率也較差針對單體 請求并發不大 可以推薦使用7)借助本地鎖(本文重點)原理:使用了 ConcurrentHashMap 并發容器 putIfAbsent 方法,和 ScheduledThreadPoolExecutor 定時任務,也可以使用guava cache的機制, gauva中有配有緩存的有效時間也是可以的key的生成?Content-MD5?Content-MD5 是指 Body 的 MD5 值,只有當 Body 非Form表單時才計算MD5,計算方式直接將參數和參數名稱統一加密MD5MD5在一定范圍類認為是唯一的 近似唯一 當然在低并發的情況下足夠了本地鎖只適用于單機部署的應用.

①配置注解

import?java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public?@interface?Resubmit?{

????/**
?????*?延時時間?在延時多久后可以再次提交
?????*
?????*?@return?Time?unit?is?one?second
?????*/
????int?delaySeconds()?default?20;
}

②實例化鎖

import?com.google.common.cache.Cache;
import?com.google.common.cache.CacheBuilder;
import?lombok.extern.slf4j.Slf4j;
import?org.apache.commons.codec.digest.DigestUtils;

import?java.util.Objects;
import?java.util.concurrent.ConcurrentHashMap;
import?java.util.concurrent.ScheduledThreadPoolExecutor;
import?java.util.concurrent.ThreadPoolExecutor;
import?java.util.concurrent.TimeUnit;

/**
?*?@author?lijing
?*?重復提交鎖
?*/
@Slf4j
public?final?class?ResubmitLock?{


????private?static?final?ConcurrentHashMap?LOCK_CACHE?=?new?ConcurrentHashMap<>(200);private?static?final?ScheduledThreadPoolExecutor?EXECUTOR?=?new?ScheduledThreadPoolExecutor(5,?new?ThreadPoolExecutor.DiscardPolicy());//?private?static?final?Cache?CACHES?=?CacheBuilder.newBuilder()//?最大緩存?100?個//??????????.maximumSize(1000)//?設置寫緩存后?5?秒鐘過期//?????????.expireAfterWrite(5,?TimeUnit.SECONDS)//?????????.build();private?ResubmitLock()?{
????}/**
?????*?靜態內部類?單例模式
?????*
?????*?@return
?????*/private?static?class?SingletonInstance?{private?static?final?ResubmitLock?INSTANCE?=?new?ResubmitLock();
????}public?static?ResubmitLock?getInstance()?{return?SingletonInstance.INSTANCE;
????}public?static?String?handleKey(String?param)?{return?DigestUtils.md5Hex(param?==?null???""?:?param);
????}/**
?????*?加鎖?putIfAbsent?是原子操作保證線程安全
?????*
?????*?@param?key???對應的key
?????*?@param?value
?????*?@return
?????*/public?boolean?lock(final?String?key,?Object?value)?{return?Objects.isNull(LOCK_CACHE.putIfAbsent(key,?value));
????}/**
?????*?延時釋放鎖?用以控制短時間內的重復提交
?????*
?????*?@param?lock?????????是否需要解鎖
?????*?@param?key??????????對應的key
?????*?@param?delaySeconds?延時時間
?????*/public?void?unLock(final?boolean?lock,?final?String?key,?final?int?delaySeconds)?{if?(lock)?{
????????????EXECUTOR.schedule(()?->?{
????????????????LOCK_CACHE.remove(key);
????????????},?delaySeconds,?TimeUnit.SECONDS);
????????}
????}
}

③AOP 切面

import?com.alibaba.fastjson.JSONObject;
import?com.cn.xxx.common.annotation.Resubmit;
import?com.cn.xxx.common.annotation.impl.ResubmitLock;
import?com.cn.xxx.common.dto.RequestDTO;
import?com.cn.xxx.common.dto.ResponseDTO;
import?com.cn.xxx.common.enums.ResponseCode;
import?lombok.extern.log4j.Log4j;
import?org.aspectj.lang.ProceedingJoinPoint;
import?org.aspectj.lang.annotation.Around;
import?org.aspectj.lang.annotation.Aspect;
import?org.aspectj.lang.reflect.MethodSignature;
import?org.springframework.stereotype.Component;

import?java.lang.reflect.Method;

/**
?*?@ClassName?RequestDataAspect
?*?@Description?數據重復提交校驗
?*?@Author?lijing
?*?@Date?2019/05/16?17:05
?**/
@Log4j
@Aspect
@Component
public?class?ResubmitDataAspect?{

????private?final?static?String?DATA?=?"data";
????private?final?static?Object?PRESENT?=?new?Object();

????@Around("@annotation(com.cn.xxx.common.annotation.Resubmit)")
????public?Object?handleResubmit(ProceedingJoinPoint?joinPoint)?throws?Throwable?{
????????Method?method?=?((MethodSignature)?joinPoint.getSignature()).getMethod();
????????//獲取注解信息
????????Resubmit?annotation?=?method.getAnnotation(Resubmit.class);
????????int?delaySeconds?=?annotation.delaySeconds();
????????Object[]?pointArgs?=?joinPoint.getArgs();
????????String?key?=?"";
????????//獲取第一個參數
????????Object?firstParam?=?pointArgs[0];
????????if?(firstParam?instanceof?RequestDTO)?{
????????????//解析參數
????????????JSONObject?requestDTO?=?JSONObject.parseObject(firstParam.toString());
????????????JSONObject?data?=?JSONObject.parseObject(requestDTO.getString(DATA));
????????????if?(data?!=?null)?{
????????????????StringBuffer?sb?=?new?StringBuffer();
????????????????data.forEach((k,?v)?->?{
????????????????????sb.append(v);
????????????????});
????????????????//生成加密參數?使用了content_MD5的加密方式
????????????????key?=?ResubmitLock.handleKey(sb.toString());
????????????}
????????}
????????//執行鎖
????????boolean?lock?=?false;
????????try?{
????????????//設置解鎖key
????????????lock?=?ResubmitLock.getInstance().lock(key,?PRESENT);
????????????if?(lock)?{
????????????????//放行
????????????????return?joinPoint.proceed();
????????????}?else?{
????????????????//響應重復提交異常
????????????????return?new?ResponseDTO<>(ResponseCode.REPEAT_SUBMIT_OPERATION_EXCEPTION);
????????????}
????????}?finally?{
????????????//設置解鎖key和解鎖時間
????????????ResubmitLock.getInstance().unLock(lock,?key,?delaySeconds);
????????}
????}
}

④注解使用案例

@ApiOperation(value?=?"保存我的帖子接口",?notes?=?"保存我的帖子接口")
????@PostMapping("/posts/save")
????@Resubmit(delaySeconds?=?10)
????public?ResponseDTO?saveBbsPosts(@RequestBody?@Validated?RequestDTO?requestDto)?{return?bbsPostsBizService.saveBbsPosts(requestDto);
????}
以上就是本地鎖的方式進行的冪等提交 使用了Content-MD5 進行加密 只要參數不變,參數加密 密值不變,key存在就阻止提交當然也可以使用 一些其他簽名校驗 在某一次提交時先 生成固定簽名 提交到后端 根據后端解析統一的簽名作為 每次提交的驗證token 去緩存中處理即可.8)借助分布式redis鎖 (參考其他)在 pom.xml 中添加上 starter-web、starter-aop、starter-data-redis 的依賴即可
<dependencies>
????<dependency>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-webartifactId>
????dependency>
????<dependency>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-aopartifactId>
????dependency>
????<dependency>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-data-redisartifactId>
????dependency>
dependencies>

屬性配置 在 application.properites 資源文件中添加 redis 相關的配置項

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
主要實現方式:熟悉 Redis 的朋友都知道它是線程安全的,我們利用它的特性可以很輕松的實現一個分布式鎖,如 opsForValue().setIfAbsent(key,value)它的作用就是如果緩存中沒有當前 Key 則進行緩存同時返回 true 反之亦然;當緩存后給 key 在設置個過期時間,防止因為系統崩潰而導致鎖遲遲不釋放形成死鎖;那么我們是不是可以這樣認為當返回 true 我們認為它獲取到鎖了,在鎖未釋放的時候我們進行異常的拋出…
package?com.battcn.interceptor;

import?com.battcn.annotation.CacheLock;
import?com.battcn.utils.RedisLockHelper;
import?org.aspectj.lang.ProceedingJoinPoint;
import?org.aspectj.lang.annotation.Around;
import?org.aspectj.lang.annotation.Aspect;
import?org.aspectj.lang.reflect.MethodSignature;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.util.StringUtils;

import?java.lang.reflect.Method;
import?java.util.UUID;

/**
?*?redis?方案
?*
?*?@author?Levin
?*?@since?2018/6/12?0012
?*/
@Aspect
@Configuration
public?class?LockMethodInterceptor?{

????@Autowired
????public?LockMethodInterceptor(RedisLockHelper?redisLockHelper,?CacheKeyGenerator?cacheKeyGenerator)?{
????????this.redisLockHelper?=?redisLockHelper;
????????this.cacheKeyGenerator?=?cacheKeyGenerator;
????}

????private?final?RedisLockHelper?redisLockHelper;
????private?final?CacheKeyGenerator?cacheKeyGenerator;


????@Around("execution(public?*?*(..))?&&?@annotation(com.battcn.annotation.CacheLock)")
????public?Object?interceptor(ProceedingJoinPoint?pjp)?{
????????MethodSignature?signature?=?(MethodSignature)?pjp.getSignature();
????????Method?method?=?signature.getMethod();
????????CacheLock?lock?=?method.getAnnotation(CacheLock.class);
????????if?(StringUtils.isEmpty(lock.prefix()))?{
????????????throw?new?RuntimeException("lock?key?don't?null...");
????????}
????????final?String?lockKey?=?cacheKeyGenerator.getLockKey(pjp);
????????String?value?=?UUID.randomUUID().toString();
????????try?{
????????????//?假設上鎖成功,但是設置過期時間失效,以后拿到的都是?false
????????????final?boolean?success?=?redisLockHelper.lock(lockKey,?value,?lock.expire(),?lock.timeUnit());
????????????if?(!success)?{
????????????????throw?new?RuntimeException("重復提交");
????????????}
????????????try?{
????????????????return?pjp.proceed();
????????????}?catch?(Throwable?throwable)?{
????????????????throw?new?RuntimeException("系統異常");
????????????}
????????}?finally?{
????????????//?TODO?如果演示的話需要注釋該代碼;實際應該放開
????????????redisLockHelper.unlock(lockKey,?value);
????????}
????}
}

RedisLockHelper 通過封裝成 API 方式調用,靈活度更加高

package?com.battcn.utils;

import?org.springframework.boot.autoconfigure.AutoConfigureAfter;
import?org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.data.redis.connection.RedisStringCommands;
import?org.springframework.data.redis.core.RedisCallback;
import?org.springframework.data.redis.core.StringRedisTemplate;
import?org.springframework.data.redis.core.types.Expiration;
import?org.springframework.util.StringUtils;

import?java.util.concurrent.Executors;
import?java.util.concurrent.ScheduledExecutorService;
import?java.util.concurrent.TimeUnit;
import?java.util.regex.Pattern;

/**
?*?需要定義成?Bean
?*
?*?@author?Levin
?*?@since?2018/6/15?0015
?*/
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public?class?RedisLockHelper?{


????private?static?final?String?DELIMITER?=?"|";

????/**
?????*?如果要求比較高可以通過注入的方式分配
?????*/
????private?static?final?ScheduledExecutorService?EXECUTOR_SERVICE?=?Executors.newScheduledThreadPool(10);

????private?final?StringRedisTemplate?stringRedisTemplate;

????public?RedisLockHelper(StringRedisTemplate?stringRedisTemplate)?{
????????this.stringRedisTemplate?=?stringRedisTemplate;
????}

????/**
?????*?獲取鎖(存在死鎖風險)
?????*
?????*?@param?lockKey?lockKey
?????*?@param?value???value
?????*?@param?time????超時時間
?????*?@param?unit????過期單位
?????*?@return?true?or?false
?????*/
????public?boolean?tryLock(final?String?lockKey,?final?String?value,?final?long?time,?final?TimeUnit?unit)?{
????????return?stringRedisTemplate.execute((RedisCallback<Boolean>)?connection?->?connection.set(lockKey.getBytes(),?value.getBytes(),?Expiration.from(time,?unit),?RedisStringCommands.SetOption.SET_IF_ABSENT));
????}

????/**
?????*?獲取鎖
?????*
?????*?@param?lockKey?lockKey
?????*?@param?uuid????UUID
?????*?@param?timeout?超時時間
?????*?@param?unit????過期單位
?????*?@return?true?or?false
?????*/
????public?boolean?lock(String?lockKey,?final?String?uuid,?long?timeout,?final?TimeUnit?unit)?{
????????final?long?milliseconds?=?Expiration.from(timeout,?unit).getExpirationTimeInMilliseconds();
????????boolean?success?=?stringRedisTemplate.opsForValue().setIfAbsent(lockKey,?(System.currentTimeMillis()?+?milliseconds)?+?DELIMITER?+?uuid);
????????if?(success)?{
????????????stringRedisTemplate.expire(lockKey,?timeout,?TimeUnit.SECONDS);
????????}?else?{
????????????String?oldVal?=?stringRedisTemplate.opsForValue().getAndSet(lockKey,?(System.currentTimeMillis()?+?milliseconds)?+?DELIMITER?+?uuid);
????????????final?String[]?oldValues?=?oldVal.split(Pattern.quote(DELIMITER));
????????????if?(Long.parseLong(oldValues[0])?+?1?<=?System.currentTimeMillis())?{
????????????????return?true;
????????????}
????????}
????????return?success;
????}


????/**
?????*?@see?Redis?Documentation:?SET
?????*/
????public?void?unlock(String?lockKey,?String?value)?{
????????unlock(lockKey,?value,?0,?TimeUnit.MILLISECONDS);
????}

????/**
?????*?延遲unlock
?????*
?????*?@param?lockKey???key
?????*?@param?uuid??????client(最好是唯一鍵的)
?????*?@param?delayTime?延遲時間
?????*?@param?unit??????時間單位
?????*/
????public?void?unlock(final?String?lockKey,?final?String?uuid,?long?delayTime,?TimeUnit?unit)?{
????????if?(StringUtils.isEmpty(lockKey))?{
????????????return;
????????}
????????if?(delayTime?<=?0)?{
????????????doUnlock(lockKey,?uuid);
????????}?else?{
????????????EXECUTOR_SERVICE.schedule(()?->?doUnlock(lockKey,?uuid),?delayTime,?unit);
????????}
????}

????/**
?????*?@param?lockKey?key
?????*?@param?uuid????client(最好是唯一鍵的)
?????*/
????private?void?doUnlock(final?String?lockKey,?final?String?uuid)?{
????????String?val?=?stringRedisTemplate.opsForValue().get(lockKey);
????????final?String[]?values?=?val.split(Pattern.quote(DELIMITER));
????????if?(values.length?<=?0)?{
????????????return;
????????}
????????if?(uuid.equals(values[1]))?{
????????????stringRedisTemplate.delete(lockKey);
????????}
????}

}

redis的提交參照

https://blog.battcn.com/2018/06/13/springboot/v2-cache-redislock/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

16.char類型

char&#xff0c;占2個字節。 單引號用來表示字符常量。例如a. char類型用來表示在Unicode編碼表中的字符。 unicode編碼被設計用來處理各種語言的所有文字&#xff0c;它占了2個字節&#xff0c;可允許有65536個字符。 Java語言中還允許使用轉義字符‘\&#xff0c;來將其后的…

轉向Kotlin——數據類和封閉類

數據類和封閉類是Kotlin中的兩種特殊的類&#xff0c;今天一起了解一下。更多精彩內容也可以關注我的微信公眾號——Android機動車 數據類 數據類是Kotlin的一個語法糖。Kotlin編譯器會自動為數據類生成一些成員函數&#xff0c;以提高開發效率。 數據類的使用 無論是Java服務器…

idea前端可視化_jsp可視化開發工具_netbeans jsp可視化_idea 可視化開發 jsp

數字生態鉅惠來襲&#xff01;秒殺 2核4G 5M帶寬 1200元/3年&#xff0c;1核1G首購 99元/年把默認改成 myeclipse jsp editor()原默認的jsp編輯器是 myeclipse visual jspdesigner&#xff0c;顧名思義&#xff0c;此編譯器是jsp可視化編輯器&#xff0c;對于初學者有很多的幫助…

開博爾智能android播放器,高端安卓播放器的選擇——開博爾Q10Plus 二代 4K高清播放器...

隨著OPPO和三星相繼宣布退出4K藍光播放器市場&#xff0c;先鋒的新機遲遲無法大量鋪貨&#xff0c;現在市面上可選擇的4K播放器就比較少了&#xff0c;價格也很高了&#xff0c;于是很多人開始將注意力轉向了安卓機&#xff0c;其中開博爾是比較有代表性的廠家了&#xff0c;這…

17.類型轉換

自動類型轉換 容量小的數據類型可以自動轉換為容量大的數據類型 byte b 123;//byte b2 300;//報錯&#xff0c;超過了byte最大值127//char c -3;//報錯&#xff0c;char范圍是0~65536&#xff0c;不在范圍char c2 a;//a在ascii碼里是98int i c2;long d01 123213;float f…

docker rabbitmq_一文看懂Rabbitmq,從安裝到實戰演練

Rabbitmq的初步使用隨著微服務概念發展&#xff0c;大應用逐步拆分為小應用&#xff0c;提高開發效率&#xff0c;專門的人做專門的事情&#xff0c;逐漸的流行起來。在微服務上實現通信的方式大部分是采用rpc方式&#xff0c;也有升級版本的grpc。還有另外一種實現就是使用mq來…

Angular v6 正式發布

Angular 6 正式發布 Angular 6 已經正式發布了&#xff01;這個主要版本并不關注于底層的框架&#xff0c;更多地關注于工具鏈&#xff0c;以及使 Angular 在未來更容易快速推進。 作為發布的一部分&#xff0c;我們同步了主要的框架包 (angular/core, angular/common, angula…

bootstrap五星評分_如何用純代碼實現評分星級顯示?

showRatingStars/*** showRatingStars 顯示評分星級* param {Object} myCanvas 畫布對象* param {Number} rating 評分* param {Number} counts star個數* param {Number} size star大小* param {Object} style star樣式* Example: style {* borderColor:"#21DEEF",…

18.變量

Java是一種強類型語言&#xff0c;每個變量都必須聲明其類型。 Java變量是程序中最基本的存儲單元&#xff0c;其要素包括變量名&#xff0c;變量類型和作用域。 變量在使用前必須對其聲明&#xff0c;只有在變量聲明以后&#xff0c;才能為其分配相應長度的存儲單元。 注意事項…

alertdialog android api 11,android – 設備api級別11的DialogFragments

我設法在兼容包的DialogFragment.java中正確修復了這個問題&#xff1a;改變第74行&#xff1a;boolean mShowsDialog false;注釋掉第232行&#xff1a;// mShowsDialog mContainerId 0;然后將兩個show方法更改為&#xff1a;public void show(FragmentManager manager, Str…

py 字典添加多個value_# Python 3 # Python 3字典Dictionary(1)

Python3 字典字典是另一種可變容器模型&#xff0c;且可存儲任意類型對象。字典的每個鍵值(key>value)對用冒號(:)分割&#xff0c;每個對之間用逗號(,)分割&#xff0c;整個字典包括在花括號({})中 ,格式如下所示&#xff1a;d {key1 : value1, key2 : value2 }鍵必須是唯…

饒軍:Apache Kafka的過去,現在,和未來

歡迎大家前往騰訊云社區&#xff0c;獲取更多騰訊海量技術實踐干貨哦~ 本文首發在云社區&#xff0c;未經許可&#xff0c;不得轉載。大家好&#xff0c;我大概簡單的介紹一下&#xff0c;我叫饒軍&#xff0c;我是硅谷的初創公司Con?uent的聯合創始人之一&#xff0c;我們公司…

機器人 樹莓派 自閉癥_用機器人孩子提高社交能力 讓自閉兒童走出自閉

一項由耶魯大學的研究團隊研究發現&#xff0c;通過讓患有自閉癥譜系障礙(autism spectrum disorders,ASD)的孩童與機器人相處一個月&#xff0c;極大地提高了自閉癥兒童的社交能力。耶魯大學研究中的機器人可以通過眼神接觸和模仿其它社交行為&#xff0c;通過講故事和互動游戲…

19.常量-final

final 常量 final修飾&#xff0c;只能被初始化一次。 public static void main(String[] args){final int a3;a4;//報錯/*TestVariable.java:7: 錯誤: 無法為最終變量a分配值a4;^ 1 個錯誤*/}常量一般用大寫來修飾。 ------------- 更多的Java&#xff0c;Angular&#xff0c;…

Android手機avi轉換為mp4手機,如何把avi轉換為mp4

AVI是目前比較常見的一種音視頻交錯格式&#xff0c;這種格式的文件在多種地方是可以看到的&#xff0c;大多在游戲錄制、光盤文件中可以見到此類文件。其畫質不錯&#xff0c;適合在電腦上觀看&#xff0c;但是現在我們使用較多的是手機、iPad等設備。如果我們想要在這些設備上…

偽代碼書寫規范_C++代碼書寫規范(推薦新手程序員)

代碼就是程序員的面子&#xff0c;無論是在工作中在電腦上寫程序代碼還是在面試時在紙上寫演示代碼我們都希望寫出整潔&#xff0c;優雅的代碼。特別在工作中當我們碰到需要維護別人的代碼&#xff0c;或者是多人參與一個項目大家一起寫代碼的時候&#xff0c;如果碰到一些丑陋…

Java基礎17:Java IO流總結

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/a724888/article/details/80201802 這位大俠&#xff0c;這是我的公眾號&#xff1a;程序員江湖。 分享程序員面試與技術的那些事。 干貨滿滿&#xff0c;關注就送。 本文介…

nuxt頁面跳轉_nuxt 項目如何解決組件復用時頁面不刷新的問題

組件復用會在兩種情況下發生&#xff1a;1、使用 keep-alive 時&#xff0c;頁面再次跳轉時&#xff0c;數據不更新每一次路由的切換都會導致頁面被重新渲染&#xff0c;無論是各種鉤子還是異步獲取數據函數都會被執行&#xff0c;為了提高網站性能&#xff0c;可以使用 keep-a…

20.命名規范

所有變量&#xff0c;方法&#xff0c;類名&#xff1a;見名知意 變量&#xff0c;方法名 --首字母小寫和駝峰原則。 如&#xff1a;run(),getName() 常量 ---大寫字母和下劃線&#xff1a;MAX_VALUE 類名 ---首字母大寫和駝峰原則。 如&#xff1a;Man,HelloWorld ------…

k8s查看pod的yaml文件_K8s-yaml的使用及命令

YAML配置文件管理對象對象管理&#xff1a;# 創建deployment資源kubectl create-f nginx-deployment.yaml# 查看deploymentkubectl get deploy# 查看ReplicaSetkubectl get rs# 查看pods所有標簽kubectl get pods--show-labels# 根據標簽查看podskubectl get pods-l appnginx# …