:d [quote]rop專案文件前後寫了乙個多月,在寫的過程中發現很多功能不完善的,又回過頭了改專案,此種反覆多次,現在rop開源專案的文件已經差不多了,將陸續在iteye此發出,希望對大家有幫助。在rop專案的開發過程中得到了眾多iteye網友的有力幫助,收到了很多很好的整改的意見,在此對他們的奉獻和幫助表示誠摯的感謝,這些網友包括但不限於:
[url=
[url=
[url=http://風一樣的男子[/url]
[url=
[url=木木的愛情童話[/url]
[url=
[url=
:) :idea:
[/quote]
[b][size=large]目錄[/size][/b]
[url=快速了解rop[/url]
[url=請求服務模型[/url]
3.應用授權及驗證
4.服務會話管理
5.錯誤處理模型
6.響應報文控制
7.檔案上傳
8.服務安全控制
9.***及事件體系
10.效能調優
11.開發客戶端sdk
12.參考資料
[b][size=x-large]應用鍵/應用金鑰[/size][/b]
當使用者需要訪問某個應用系統前,應用系統一般都需要對該使用者進行身份認證。常見的身份認證方法是讓使用者輸入「使用者/密碼」,當通過驗證後,允許進入系統,否則阻止使用者登入系統。
[b][size=x-large]應用鍵/金鑰管理器[/size][/b]
由於rop需要在服務端採用相同的演算法計算請求引數的簽名,並和客戶端傳送過來的簽名進行比較,如果兩者相等,便認為當前互動的客戶端是合法的客戶端,反之則認為是乙個非法的客戶端。
[list]
[/list]
[quote]00001=abcdeabcdeabcdeabcdeabcde
00002=abcdeabcdeabcdeabcdeaaaaa[/quote]
[b][size=x-large]簽名演算法[/size][/b]
(1)所有請求引數按引數名公升序排序;
(2)按請求引數名及引數值相互連線組成乙個字串:…;
(3)將應用金鑰分別新增到以上請求引數串的頭部和尾部:《請求引數字串》;
(4)對該字串進行sha1運算,得到乙個二進位制陣列;
(5)將該二進位制陣列轉換為十六進製制的字串,該字串即是這些請求引數對應的簽名;
(6)該簽名值使用sign系統級引數一起和其它請求引數一起傳送給服務開放平台。
假設,user.create的服務有3個業務級引數,分別為username、age及***。這些業務級引數和系統級引數的值如下表所示:
[table]
|系統級引數名稱 |引數值 v業務級引數名稱| 引數值|
|sessionid |aaaa |age |24|
|method |user.create |*** |1|
|v |1.0 |
|format |xml |
|locale |zh_cn |
[/table]
根據rop的簽名演算法,首先按字母順序將所有引數名和引數值拼裝成乙個字串:
對以上字串進行sha1簽名運算,將簽名值轉換為十六進製制的編碼串,得到:
[quote]8625fd7eeae1e68203b48c64de495792bf59e833[/quote]
最後,客戶端即可使用如下的url請求串對user.create服務方法發起請求:
[b][size=x-large]簽名功能控制[/size][/b]
預設情況下,rop會對每個服務請求進行簽名驗證,如果簽名驗證報錯,將直接駁回請求並回報相應的錯誤資訊。rop允許服務平台開發者開啟或關閉簽名驗證的功能,rop提供了3個級別的控制:
[list]
[*]平台級:開啟或關閉服務平台所有服務的簽名驗證功能;
[*]服務級:在平台級簽名驗證功能開啟的情況下,可以關閉某個具體服務的簽名驗證;
[*]引數級:在後續內容中,我們知道rop的簽名演算法要求把所有的引數拼裝成乙個字串,如果有些引數值很大(如上傳檔案的檔案內容),簽名演算法將需要構造乙個很大的字串,占用很大的記憶體。從安全上來說,僅需對一些關鍵的引數進行簽名就可以了,並非一定要對所有的引數進行簽名。有鑑於此,rop在服務簽名時允許忽略某些引數,提供引數級的簽名控制。
[/list]
[b][size=large]平台級控制[/size][/b]
通過的sign-enable屬性即可開啟或關閉服務平台簽名驗證功能:
我們強烈建議在生產環境下開啟服務簽名驗證的功能,以保證服務平台的安全性,免受惡意客戶終端的攻擊。
服務級控制
在平台級簽名功能開啟的情況下,rop還允許關閉某個服務的簽名驗證功能。通過將@servicemethod的ignoresign屬性設定為ignoresigntype.yes即可:
@servicemethod(method = "user.add", version = "5.0", ignoresign = ignoresigntype.yes)
public object adduser5(createuserrequest request)
這樣,客戶端在訪問user.add#5.0的服務方法時,就不必提供請求引數的簽名資訊了。
[b][size=large]引數級控制[/size][/b]
在定義服務方法的roprequest類時,只要在roprequest的某些屬性上標註了@ignoresign,這些屬性所對應的請求引數就可以排除在簽名引數列表之外了。來看乙個例子:
public class logonrequest extends abstractroprequest")
private string username;
@ignoresign
@pattern(regexp = "\\w")
private string password;
...}
logonrequest的password屬性所對應的請求引數將不會納入到簽名演算法的引數列表中。使用這種辦法,可以在具體的roprequest類中將某些屬性對應的請求引數排除在簽名演算法之外。
如果希望某一型別的屬性統一忽略簽名,有沒有簡單的方法呢?rop提供了一種非常便捷的方法,即在屬性類定義處使用@ignoresign註解即可。如用於儲存上傳檔案的uploadfile類就標註了@ignoresign註解:
@ignoresign
public class uploadfile
這樣,uploadfile作為任何roprequest類的屬性都將排除在簽名演算法的引數列表之外。關於uploadfile的進一步資訊,請參見後續的內容。
開啟最簡單的tornado服務
import tornado.ioloop 開啟迴圈的模組 import tornado.web web伺服器的大部分方法封裝在這裡 class mainhandler tornado.web.requesthandler 類檢視 def get self,args,kwargs get請求 sel...
C 最簡單的登入Web服務
由於演示程式,所以有以下問題 1,密碼是明碼傳輸。本文在 c 建立最簡單的web服務,無需iis 的基礎上完成。具體步驟 一,requestprocessor增加變數mlogin,改寫parserequestandprocess函式。protected bool mlogin false publi...
C 最簡單的登入Web服務
因為演示程式,所以有下面問題 1。password是明碼傳輸。本文在 c 建立最簡單的web服務,無需iis 的基礎上完畢。詳細步驟 一。requestprocessor新增變數mlogin,改寫parserequestandprocess函式。protected bool mlogin false...