基於Java的REST架構風格及介面安全性設計的討論

来源:http://www.cnblogs.com/lyjin/archive/2017/06/28/7090790.html
-Advertisement-
Play Games

1.REST即表現層狀態傳遞(Representational [,rɛprɪzɛn'teʃnl] State Transfer,簡稱REST)。 (1)REST名詞解釋: 通俗來講就是資源在網路中以某種表現形式進行狀態轉移。分解開來: Resource:所指的不只是數據,而是數據和表現形式的組合; ...


1.REST即表現層狀態傳遞(Representational [,rɛprɪzɛn'teʃnl] State Transfer,簡稱REST)。

(1)REST名詞解釋: 通俗來講就是資源在網路中以某種表現形式進行狀態轉移。分解開來: Resource:所指的不只是數據,而是數據和表現形式的組合; Representational:某種表現形式,比如用JSON,XML,JPEG等; State Transfer:狀態變化。通過HTTP動詞實現。 (2)RESTful API: REST(表述性狀態轉移)是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是RESTful。 參考博文: http://www.ruanyifeng.com/blog/2014/05/restful_api.html     2.Java中實現RESTful API的主流框架: l Jersey l RESTEasy l Restlet l Apache CXF 以上幾個均為基於JAX-RS的實現,在性能測試中,JBoss的RESTEasy吞吐率最好,SUN的Jersey其次,CXF、Restlet最差。(網評)     3.滿足HATEOAS(超媒體作為應用狀態的引擎 Hypermedia As The Engine Of Application State)約束的REST實現,使用Spring Data項目中的以下幾個子項目: (1)spring-data-rest並沒有真正的實現JAX-RS(Java API for RESTful Web Services)規範。 其中JAX-RS是Oracle的Java EE 6的技術,與Spring開源平臺下的框架有所不同。 (2)Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的代碼即可實現對數據的訪問和操作。 此外,Spring Data還包括包括非關係資料庫、Map-Reduce 框架、雲數據服務等等;   HATEOAS(Hypermedia as the engine of application state)是 REST 架構風格中最複雜的約束,也是構建成熟 REST 服務的核心。REST 成熟度模型把 REST 服務按照成熟度劃分成 4 個層次:
  • 第一個層次(Level 0)的 Web 服務只是使用 HTTP 作為傳輸方式,實際上只是遠程方法調用(RPC)的一種具體形式。SOAP 和 XML-RPC 都屬於此類。
  • 第二個層次(Level 1)的 Web 服務引入了資源的概念。每個資源有對應的標識符和表達。
  • 第三個層次(Level 2)的 Web 服務使用不同的 HTTP 方法來進行不同的操作,並且使用 HTTP 狀態碼來表示不同的結果。如 HTTP GET 方法來獲取資源,HTTP DELETE 方法來刪除資源。
  • 第四個層次(Level 3)的 Web 服務使用 HATEOAS。在資源的表達中包含了鏈接信息。客戶端可以根據鏈接來發現可以執行的動作。
  從上述 REST 成熟度模型中可以看到,使用 HATEOAS 的 REST 服務是成熟度最高的,也是推薦的做法。對於不使用 HATEOAS 的 REST 服務,客戶端和伺服器的實現之間是緊密耦合的。客戶端需要根據伺服器提供的相關文檔來瞭解所暴露的資源和對應的操作。當伺服器發生了變化時,如修改了資源的 URI,客戶端也需要進行相應的修改。而使用 HATEOAS 的 REST 服務中,客戶端可以通過伺服器提供的資源的表達來智能地發現可以執行的操作。當伺服器發生了變化時,客戶端並不需要做出修改,因為資源的 URI 和其他信息都是動態發現的。   參考:https://spring.io/guides/gs/accessing-data-rest/   4.介面的安全性設計: (1)使用HTTPS加密傳輸。 非對稱加密技術:服務端生成一把給服務端自己用的私鑰,一把給客戶端使用的公開的公鑰。原則是只有私鑰能打開公鑰,公鑰能打開私鑰,其中一種經典的實現叫RSA演算法。
  1. 客戶端向伺服器索取公鑰 PublicKey;
  2. 伺服器將公鑰發給客戶端(這裡沒有保密需求,因為公鑰是向所有人公開的);
  3. 客戶端使用伺服器的公鑰 PublicKey 把 Pre-Master-Key 加密成密文,傳送給伺服器;
  4. 伺服器用私鑰 PrivateKey 解密密文,獲取到客戶端發送的 Pre-Master-Key;
其中的第二步容易出現被中間人攔截偽造公鑰,這又如何解決? 需要服務端給客戶端發送一個證書,上面記載了伺服器的功能變數名稱,公鑰,單位,簽發機關,有效期等。 但是,又如何保障證書的安全? 其中一種防偽手段就是加簽名,只要有權威機構的簽名,就可以確認證書是真是的。而電腦的數字化簽名也是使用非對稱加密技術,具體不再詳述。   *(2)身份認證:使用JWT(無狀態分散式授權,支持各類語言) / OAuth 2.0等。 JWT原理圖:   參考博文 http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/   *(3)許可權管理:Apache Shiro(不依賴Web環境)、Spring Security等。 可以看到:應用代碼直接交互的對象是Subject,也就是說Shiro的對外API核心就是Subject;其每個API的含義: Subject:主體,代表了當前“用戶”,這個用戶不一定是一個具體的人,與當前應用交互的任何東西都是Subject,如網路爬蟲,機器人等;即一個抽象概念;所有Subject都綁定到SecurityManager,與Subject的所有交互都會委托給SecurityManager;可以把Subject認為是一個門面;SecurityManager才是實際的執行者; SecurityManager:安全管理器;即所有與安全有關的操作都會與SecurityManager交互;且它管理著所有Subject;可以看出它是Shiro的核心,它負責與後邊介紹的其他組件進行交互,如果學習過SpringMVC,你可以把它看成DispatcherServlet前端控制器; Realm:域,Shiro從從Realm獲取安全數據(如用戶、角色、許可權),就是說SecurityManager要驗證用戶身份,那麼它需要從Realm獲取相應的用戶進行比較以確定用戶身份是否合法;也需要從Realm得到用戶相應的角色/許可權進行驗證用戶是否能進行操作;可以把Realm看成DataSource,即安全數據源。 (4)安全過濾:包括防止一些SQL註入、XSS、XXE、XSRF漏洞等。 (5)速度限制:限制某段時間內用戶請求次數。 (6)錯誤處理:非法操作記錄和處理。 (7)參數加密:介面參數加密+時效性驗證+私鑰,如:騰訊開放平臺的OpenAPI。     5.討論與總結: (1)REST相比於傳統SOAP的優勢?
  • 可以利用緩存Cache來提高響應速度
  • 通訊本身的無狀態性可以讓不同的伺服器處理一系列請求中的不同請求,提高伺服器的擴展性
  • 瀏覽器即可做客戶端,簡化軟體開發的需求
  • 相對於其他疊加的HTTP協議之上的機制,REST的軟體依賴性更小
  • 不需要額外的資源發現機制
  • 在軟體技術演進中的長期的相容性更好
  SOAP並不假定傳輸數據的下層協議,因此必須設計為能在各種協議上運行。即使絕大多數SOAP是運行在HTTP上,使用URI標識服務,SOAP也僅僅使用POST方法發送請求,用一個唯一的URI標識服務的入口。當然SOAP也有其自己適用的場景,在安全性、原子性事務、消息可靠性方面有自己獨特的優點。   (2)REST設計的核心是什麼?
  1. 資源(Resource)
這個討論有爭議,有人提出REST並不是圍繞資源而設計的,而是一種為”建立十年內不過時的軟體系統架構“而建立的一種架構風格,也有人認為REST設計是以系統資源為中心的Web服務,如“最新訪問的10位會員”和“最活躍的10位會員”在數據上可能有重疊或者完全相同,而由於他們的表現形式不同,所以被歸為不同的資源。
  1. 資源的表現形式(Representation)
比如用JSON,XML,JPEG等;
  1. 狀態轉移(State Transfer)
一般地,GET/POST/PUT/DELETE即可滿足。
  1. 統一介面(Uniform Interface)
對資源使用一致的命名規則(naming scheme),使用唯一、全局統一的命名規則的好處,既適用於瀏覽器中的Web應用,也適用於機對機(machine-to-machine,m2m)通信。
  1. 超文本驅動(Hypertext Driven)
“超媒體作為應用狀態的引擎(Hypermedia as the engine of application state)”,有時簡寫為HATEOAS。嚴格地說這個描述的核心是超媒體概念,換句話說:是鏈接的思想。 應用程式(已經檢索過文檔)如何“跟隨”鏈接檢索更多的信息。當然,如果使用一個遵守專用命名規範的簡單“id”屬性作為鏈接,也是可行的——但是僅限於應用環境之內。使用URI表示鏈接的優雅之處在於,鏈接可以指向由不同應用、不同伺服器甚至位於另一個大陸上的不同公司提供的資源——因為URI命名規範是全球標準,構成Web的所有資源都可以互聯互通。 超媒體原則還有一個更重要的方面——應用“狀態”。簡而言之,實際上伺服器端(如果你願意,也可以叫服務提供者)為客戶端(服務消費者)提供一組鏈接,使客戶端能通過鏈接將應用從一個狀態改變為另一個狀態。 對此原則總結如下:任何可能的情況下,使用鏈接指引可以被標識的事物(資源)。   (3)REST的應用場景?   如騰訊開放平臺REST API導航圖:      

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在我們做項目的過程中,我們會用到SmartGit這個軟體來將本地的MAVEN項目push到國內的碼雲(https://git.oschina.net)或者是國外的github網站進行項目的管理,這個時候需要用到Smartgit。但是SmartGit是收費的,可以30天的試用期,30天試用期過後,sm ...
  • 一、XSS 跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script代碼會被執行 ...
  • 使用Microsoft Web Platform在IIS里配置安裝一個wordpress,一切順利。 當添加一片文章時,自動生成URL類似如下: http://localhost/wordpress/index.php/2017/06/28/dc%e8%b6%85%e8%83%bd%e5%a6%b9... ...
  • 題目描述 在一個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成一個N 行M 列的矩形,如上圖所示,其中每個格子都代表一座城市,每座城市都有一個海拔高度。 為了使居民們都儘可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸 ...
  • 新人初涉博客,許個願望:每天記錄一點學習筆記,不懂得,重要的,考題等等。 ...
  • 一、windows 1. 下載tomcat 2. 進入bin目錄,查看是否存在service.dat,如果沒有自行創建 3. 打開cmd,進入tomcat>bin目錄 說明:用法: service.bat install/remove [service_name] [/user username] ...
  • instanceof是Java的一個二元操作符(運算符),也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回的是boolean類型的數據。用它來判斷某個對象是否是某個Class類的實例。 用法: boolean result = object instanceof clas ...
  • 其實沒有完整的9天,就是連續每天花點時間,過程so frustrated,踩坑無數。。。下麵是學習過程的記錄 第1天 開始正式學習JavaEE,已完成: 1. Tomcat安裝; 2. Tomcat配置。完成了IIS占用的80埠停用,將Tomcat監聽埠改為80埠,然後修改hosts,增加解析 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...