標籤:time top https lan xxx java代碼 map equals 好的
幾乎都是同事小哥哥幫我鋪路,給我參考連結,實現的理論方法以及知識,我只剩下看資料,敲代碼,出錯了也是他幫我看著一步步解釋搞定過來的。嗯,大好人一枚。
ok,思路:
是產生一個隨機數放在url裡面,當做參數傳遞,在業務請求controller那裡檢驗這個nonce是否與緩衝裡的一致,並且添加一個時間戳記的屬性,這樣可以設定一段時間內url有效,過段時間點擊就出現連結失效的情況。
開始咯:
1:使用了SecureRandom產生隨機數nonce
import java.security.SecureRandom; String nonce = null; SecureRandom random = null; try { random = SecureRandom.getInstance("SHA1PRNG"); System.out.println("SecureRandom random init:" + random); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } byte[] values = new byte[20]; random.nextBytes(values); nonce = String.valueOf(random.nextLong());
2 : 自訂一個class ,來構建一個對象,對象裡面存放時間戳記,nonce,openid.產生之後,把它放到一個cache裡面,這個Guava Cache 存放。
假如只是簡單的把Guava Cache當作HashMap或ConcurrentHashMap的替代品,不需要用到load方法,而是手動地插入,可以這樣:
Java代碼
public static final Cache<String, Object> cache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).build();
注意不能用LoadingCache了。
尋找:
cache.getIfPresent("xx");
插入:
cache.put("xx", "xxx");
3 : 擷取緩衝裡面的資料去對比檢驗就好了
private Boolean checkTimeOut(String openid,String nonce){ Boolean flag = false; if(!nonce.isEmpty()){ StructureOfNonce v = (StructureOfNonce) MenuClickEventHandler.cache.getIfPresent(nonce); String cnonce = v.getNonce(); String copenid = v.getOpenid(); long createTimestamp = v.getTimestamp(); if(openid.equalsIgnoreCase(copenid) && nonce.equalsIgnoreCase(cnonce)){ Long currentTime = System.currentTimeMillis(); int time =(int) (currentTime - createTimestamp)/1000/60 ; if(0 <= time && time <= 1){ flag = true; } } } return flag; }
Cheers !
好的,全是別人的經驗,下面放巨人的果實吧!
詳細解析cacheGuava Cache :
http://bylijinnan.iteye.com/blog/2225074
CacheBuilder類的文檔:
https://google.github.io/guava/releases/17.0/api/docs/com/google/common/cache/CacheBuilder.html 單例模式實現的範例,提供解題思路:https://gxnotes.com/article/36005.html 產生隨機數:https://tersesystems.com/2015/12/17/the-right-way-to-use-securerandom/
保護url時效性和安全性的一種解決方案