當前不少網站是先後分離的,前端(android,iso,h5)經過restful API 調用 後端服務器,這就存在一個問題,對於建立操做,好比購買某個商品,若是因爲某種緣由,手抖,控件bug,網絡錯誤,可能致使一次操做實際上購買了屢次同一個產品。因此,咱們要考慮防止重複提交。這個重複提交咱們只限定於建立操做,對於修改和刪除操做,原則上是冪等的,不用擔憂,查詢操做更不用擔憂重複操做。前端
方案一,前端在提交時候生成一個基於時間的sequence,將這個參數傳到後端,後端根據uriPath+userId+sequence做爲key,採用redis分佈式鎖,setNX,防止重複提交android
方案二,前端不用傳遞sequence,後端根據請求的payload和其餘參數來肯定惟一,uriPath+userId+MD5(JsonString(全部參數))做爲key,用redis分佈式鎖redis
具體實現:spring
對於方案一,防止重複提交交給了前端控制,sequence的生成能夠是時間戳。後端能夠作在servlet filter 中或者在restful 框架的filter中好比resteasy 的ContainerRequestFilter中後端
對於第二種方案,防止重複提交徹底由後端控制,前端無感,不能作在filter中,由於request payload只能被消費一次。能夠用spring aop來實現,對resource method 作aop攔截。服務器
優劣:基於咱們的目的,是爲了防止重複提交,第二種方案可以更完全的防止重複提交,而且易於控制。restful