Java技術java
Web 服務是一個軟件接口,它描述了一組能夠在網絡上經過標準化的 XML 消息傳遞訪問的操做.web
Web Service 最基本的組成部分爲服務的提供者(Service Provider)和服務的請求者(Service Requester),這兩端痛過XML格式進行通訊。算法
WSDL:用於用於描述和定位網絡服務。WSDL中主要有以下元素,數據庫
<portType> 是最重要的一個元素,用來描述web服務支持的操做及相關信息。能夠把該元素比做傳統編程語言中的一個函數庫(或一個模塊、或一個類),而把每一個操做比做傳統編程語言中的一個函數。編程
<message> 用來定義一個操做(函數)的具體調用格式(函數名,參數名等等)瀏覽器
<portType>代碼片斷:緩存
1 <message name="getTermRequest"> 2 <part name="term" type="xs:string"/> 3 </message> 4 5 <message name="getTermResponse"> 6 <part name="value" type="xs:string"/> 7 </message> 8 9 <portType name="glossaryTerms"> 10 <operation name="getTerm"> 11 <input message="getTermRequest"/> 12 <output message="getTermResponse"/> 13 </operation> 14 </portType>
<binding> 描述要使用哪一種方式將上面的端口<portType>進行綁定,通常能夠綁定到SOA。安全
若是是綁定到SOA,則須要在<binding>使用<soap:binding>子標籤中使用定義SOAP協議內容。服務器
在<soap:binding>中,經過style屬性指定rpc或者document, 經過transport 定義了要使用的 SOAP 協議(例如http),在<operator>則定義了每一個端口提供的操做符。cookie
一個<binding>代碼片斷:
1 <message name="getTermRequest"> 2 <part name="term" type="xs:string" /> 3 </message> 4 5 <message name="getTermResponse"> 6 <part name="value" type="xs:string" /> 7 </message> 8 9 <portType name="glossaryTerms"> 10 <operation name="getTerm"> 11 <input message="getTermRequest" /> 12 <output message="getTermResponse" /> 13 </operation> 14 </portType> 15 16 <binding type="glossaryTerms" name="b1"> 17 <soap:binding style="document" 18 transport="http://schemas.xmlsoap.org/soap/http" /> 19 <operation> 20 <soap:operation 21 soapAction="http://example.com/getTerm" /> 22 <input> 23 <soap:body use="literal" /> 24 </input> 25 <output> 26 <soap:body use="literal" /> 27 </output> 28 </operation> 29 </binding>
UDDI(Universal Description, Discovery and Integration)即「通用描述、發現與集成服, 是一種目錄服務,企業可使用它對 Web services 進行註冊和搜索
1.3 SOAP
按照 Web Service 的相關標準描述,服務的提供者應該首先經過 WSDL(Web Service Definition Language)和 UDDI (Universal Description, Discovery, and Integration)發佈它所提供的服務到一個統註冊這些服務信息的存儲庫中去。這樣,服務的請求者就也能夠經過 WSDL 和 UDDI 發現到服務提供者提供的服務,並能夠經過應用的調用方法來使用這個服務了。
SOA的重點在於集成,重用,分佈式。
面向服務的體系結構(Service-Oriented Architecture,SOA)是一種 IT 體系結構風格,支持將您的業務轉換爲一組相互連接的服務或可重複業務任務,可在須要時經過網絡訪問這些服務和任務。
SOA 描述了服務的整個系統如何動態地相互查找,如何彙集在一塊兒執行某些應用程序,以及如何按照多種方式進行組合。該模型鼓勵技術和軟件的重用,以及使用SOA模型實現分佈式系統。
優化方向:
a.將請求儘可能攔截在系統上游。
主要是爲了避免要讓鎖衝突落到數據庫上面去。
這裏須要在各個層次進行優化。
第一層是在客戶端優化,例如對瀏覽器,APP等,不該該將每一次提交都真正提交到應用程序,而是應該設置一些防做弊機制,攔截部分請求(例如提交完button就變灰,5分鐘才能提交一次等等)
第二層是在MVC層或者業務層,若是有攻擊者擁有大量動態IP進行for循環秒殺,應該按UID進行有效識別和攔截。可是若是攻擊者擁有大量肉雞(即,不只有動態IP,並且有不一樣UID),用UID過濾就不起做用了。
第三層是在服務層攔截,對於上面挾持肉雞的攻擊是看做正經常使用戶的,這裏不討論攻擊,只討論攔截,對於這種大訪問量,在服務層能夠用隊列進行串行化訪問(分批),根據商品存量每次放出適當訪問請求就能有效控制服務層壓力。
對於第三層,能夠用來確保寫請求不超過數據庫的鏈接限制。
第四層是利用緩存緩解讀請求(秒殺基本都是讀多寫少),讓大部分請求都能讀到混存,能有效緩解數據庫壓力。
第五層是異步操做,搶票成功後的付款採用異步方式返回。
經過上面一些列優化以後,可以有效控制真正讀和寫數據庫的請求數量。固然也能夠在業務規則層面先進行優化,例如12306分時分段售票。。。而此時對於數據庫來講,由於前面的大量工做攔截了大量請求,數據庫的壓力能夠控制在安全範圍進行事務操做了。
3.設計單點登陸,說明令牌生成機制及安全保障
單點登陸的通常設計思路是,使用統一受權模塊生成token,寫入客戶端cookie,客戶端在登陸其餘子站點時,將包含token的cookie發送至子站點,子站點再與統一受權模塊校驗合法性,合法則在子站點爲用戶生成session代表受權成功,進行後續操做。
基於這種方式實現的單點登陸,cookie的安全性是一個很大問題。
有的系統會設計預登陸方式,即用戶第一次經過統一模塊進行受權時,若是受權經過,統一模塊再強制將客戶端重定向到各個子站點,即預先登陸各個子站點,各個子站點都會寫入session。
預登陸不只能夠簡化客戶端登錄流程,並且安全性更高,由於預登陸的時候,用的是統一模塊第一次發給客戶端的原始session-cookie在各個子站點進行受權(寫session),而不是各個子站點臨時爲客戶端生成的session-cookie,
統一受權模塊在第一次發送sesion-cookie給客戶端的時候,徹底能夠在cookie中加入服務器端特有信息,達到難以僞造的目的,同時經過SSL通道進行cookie傳輸,保證cookie不會被攔截偷取。
另外,採用預登陸的方式,若是一個用戶已經登陸,則在各個子站點存在session[hash(uid+timestame+服務器數字簽名),],且在數據庫中也是登陸狀態。若是此時有人僞造用戶id和cookie去登陸,因爲僞造的cookie與統一受權模塊分配的session-cookie並不相同,那麼各個子站點就不會存在這個session[hash(uid+timestame+服務器數字簽名)],然而數據庫卻顯示此用戶一登錄,那麼此時能夠判斷次用戶異常(有惡意破解嫌疑)。
另外,即便hash(uid+timestame+服務器數字簽名),即便被盜取,也沒法篡改,這是數字簽名的特徵,基於這一點,讓timestame儘快失效能夠提升安全性。
簽名過程
「發送報文時,發送方用一個哈希函數從報文文本中生成報文摘要,而後用本身的私人密鑰對這個摘要進行加密,這個加密後的摘要將做爲報文的數字簽名和報文一塊兒發送給接收方,接收方首先用與發送方同樣的哈希函數從接收到的原始報文中計算出報文摘要,接着再用發送方的公用密鑰來對報文附加的數字簽名進行解密,若是這兩個摘要相同、那麼接收方就能確認該數字簽名是發送方的。
數字簽名有兩種功效:一是能肯定消息確實是由發送方簽名併發出來的,由於別人假冒不了發送方的簽名。二是數字簽名能肯定消息的完整性。由於數字簽名的特色是它表明了文件的特徵,文件若是發生改變,數字摘要的值也將發生變化。不一樣的文件將獲得不一樣的數字摘要。 一次數字簽名涉及到一個哈希函數、發送者的公鑰、發送者的私鑰。」
關於數字簽名和數字證書,能夠參考 http://justjavac.iteye.com/blog/1144151
1. 樹的按層次遍歷
思路,用一個FIFO隊列輔助,初始狀態是將樹的根節點放進隊列,
而後進行循環操做,跳出條件是隊列是否爲空。
每次從隊列彈出(poll())一個元素,首先打印出這個節點,而後判斷是否有左孩子,若是有就將左孩子入隊列,接着判斷是否有右孩子,若是有也入隊列,如此循環,當隊列爲空的時候,也就完成了層次遍歷。
1 public void levelTravel() { 2 LinkedList<Node> queul = new LinkedList<>(); 3 queul.push(root); 4 while (!queul.isEmpty()) { 5 Node tmpNode = queul.poll(); 6 System.out.print(tmpNode.value+"#"); 7 if(tmpNode.left != null) { 8 queul.push(tmpNode.left); 9 } 10 if(tmpNode.right != null) { 11 queul.push(tmpNode.right); 12 } 13 } 14 }
2. 單鏈表,在不知道前一個節點地址的狀況(可是知道後一個節點),如何刪除後一個節點。
把將要刪除節點的內存數據直接拷貝到後一個節點位置,而後釋放內存。
3.0~999,如何用數學方法快速計算有多少個數字裏含有7
1+10+9+100+90+90 = 300