1,Api接口冪等設計,也就是要保證數據的惟一性,不容許有重複。java
例如:rpc 遠程調用,由於網絡延遲,出現了調用了2次的狀況。redis
表單連續點擊,出現了重複提交。spring
接口暴露以後,會被模擬請求工具(Jemter等)進行攻擊。apache
2,怎麼樣保證接口冪等設計呢?api
可使用Token方式,每次調用Api 接口(提交表單)以前,會調用api生成token,並將token給客戶端保存,redis裏面也保存token,redis 能夠設置有效時長,約15-60 分鐘緩存
當提交表單的時候,請求頭裏面要攜帶token,將請求頭裏面的token 拿出來和redis 裏面的token進行比較,redis 裏面有token,則表單提交,同時,刪除token,redis 裏面沒有,則表單不提交。網絡
3,調用index 方法的時候,生成token,客戶端保存,點擊提交,調用postIndex 接口前,token 驗證dom
,工具
4,安裝redispost
5, 基於redis 寫個redis 緩存token
package com.aiyuesheng.util; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; @Component public class BaseRedisService { @Autowired private StringRedisTemplate stringRedisTemplate; public void setString(String key, Object data, Long timeout) { if (data instanceof String) { String value = (String) data; stringRedisTemplate.opsForValue().set(key, value); } if (timeout != null) { stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS); } } public Object getString(String key) { return stringRedisTemplate.opsForValue().get(key); } public void delKey(String key) { stringRedisTemplate.delete(key); } }
package com.aiyuesheng.util; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class RedisToken { @Autowired private BaseRedisService baseRedisService; private static final long TIMEOUT = (60 * 60 * 60); public String setToken() { String token = System.currentTimeMillis() + "" + UUID.randomUUID(); baseRedisService.setString(token, token, TIMEOUT); return token; } public String getToken(String tokenKey) { if(!StringUtils.isEmpty((String) baseRedisService.getString(tokenKey))){ return (String) baseRedisService.getString(tokenKey); } return ""; } }
6,每次進行對比下。。。驗證