一般在做介面請求的時候為了保證引數的一致性和防止有人利用正確的引數做大量的重複請求,一般都會做簽名驗證。
在spring cloud的專案一般是在閘道器,利用過濾器的方式進行驗證。
public class signfilter extends zuulfilter
/*** 判斷該過濾器是否需要被執行。這裡我們直接返回了true,因此該過濾器對所有請求都會生效。
* 實際運用中我們可以利用該函式來指定過濾器的有效範圍。
** @return
*/@override
public boolean shouldfilter()
return false;
} /**
* filter執行順序,通過數字指定。
* 數字越大,優先順序越低。
** @return
*/@override
public int filterorder()
/*** 過濾器的型別,它決定過濾器在請求的哪個生命週期中執行。
* 這裡定義為pre,代表會在請求被路由之前執行。
** @return
*/@override
public string filtertype()
以下是簽名驗證的方法。
public boolean validatesign(mapparammap)
//獲取accesskey 下面這部分,可以針對用於做認證,此處暫時忽略
// string accesskey = pub_tools.getstring_trimzerolenasnull(parammap.get("accesskey"));
// string secretkey = null;
// if(accesskey==null)else
// }
//第一步判斷時間戳 timestamp=201808091113
//和伺服器時間差值在10分鐘以上不予處理
string timestamp = pub_tools.getstring_trimzerolenasnull(parammap.get("timestamp"));
//如果沒有帶時間戳返回
if(timestamp==null)else
//第二步獲取隨機值
string nonce = pub_tools.getstring_trimzerolenasnull(parammap.get("nonce"));
if(nonce==null)elseelse
}/**
* 上述驗證通過,開始驗證引數是否正確
* 1、按照請求引數名的字母公升序排列非空請求引數(包含accesskey),使用url鍵值對的格式(即key1=value1&key2=value2…)拼接成字串stringa,這其中包含timestamp和nonce
* 2、在stringa最後拼接上secretkey得到字串stringsigntemp
* 3、對stringsigntemp進行md5運算,並將得到的字串所有字元轉換為大寫,得到sign值。
* 4、比較計算出的sign值和使用者傳入的sign值是否相等
*///排序
setkeyset = parammap.keyset();
string keyarray = keyset.toarray(new string[keyset.size()]);
arrays.sort(keyarray);
stringbuilder sb = new stringbuilder();
for (string k : keyarray)
if (parammap.get(k).trim().length() > 0) // 引數值為空,則不參與簽名
}//暫時不需要個人認證
//加密
string server_sign = keyutil.md5(sb.tostring()).touppercase();
//判斷當前簽名是否正確
if(server_sign.equals(sign))
} catch (exception e)
} return false;
}
SpringCloud閘道器配置
用了springcloud一段時間了 今天想動手搭建,結果忘了 註冊中心和服務都建好了 天真的以為可以通過註冊中心的位址加上服務名就可以訪問服務了 結果忘了閘道器這一茬 看來還是對springcloud元件的功能了解非常不足 先貼這塊了 package com import org.springfr...
SpringCloud閘道器gateway超時排查
如圖所示,運營人員反饋線上偶發性出現異常,然後我們獲取一筆單來看,發現閘道器超時。系統用的是springcloud閘道器gateway作為服務 出現超時的ip和專案部署伺服器的ip並不是同乙個ip,假設上面異常 10.10.10.11,而專案部署伺服器的ip 10.20.10.11,明顯不一致導致,...
SpringCloud 服務閘道器
上篇部落格 springcloud eureka服務註冊和發現 中介紹了註冊中心eureka 服務提供者和服務消費者。這篇部落格我們將介紹服務閘道器。圖 1 未使用服務閘道器的做法 圖 2 服務閘道器的做法 服務閘道器,英文service gateway,他是微服務框架中唯一的入口。有些類似外觀模式...