使用Java API的5個技巧

2020-12-06 CSDN

原文:5 Tips for Building Your Java API

作者:Brian Demers

譯者:Jackyrong

本文介紹了一些關於Java API安全和性能方面的簡單易用的技巧,其中包括保證API Key安全和開發Web Service方面中在框架方面選擇的一些建議。

程式設計師都喜歡使用API!例如為app應用構建API或作為微服務架構體系的一部分。當然,使用API的前提是能讓你的工作變得更輕鬆。為了簡化開發和提高工作效率所作出的努力,有時也意味著需要尋找新的類庫或者過程(或者減少過程)。對於很多開發團隊來說,對於其APP和API進行管理認證和訪問控制要耗費很多的時間,因此我們需想分享一些技巧,它們能節約你的時間,減少代碼編寫量,並能讓你的應用更加安全和易於維護。

先介紹下本文提及的背景知識:Okta是一個基於REST、JSON API構建的Java應用,使用Spring框架構建。我們公司的應用,是保存用戶的身份憑證和其他公司的敏感數據,所以對我們來說,安全是最重要的。因此,我對這些技巧的第一個要求是,它們能幫助令到你的Java應用更安全。

這些建議應該是任何類型的Java應用都是通用的。它們會幫助你更快地編寫代碼,但代碼量更少了,同時又更安全:這真的是三贏的結果!

不要自己去實現安全框架

說真的,不要嘗試自己去實現安全方面的代碼,這太難了。

幾乎每個人都知道避免去實現加密等算法。同樣道理,你的應用的安全棧的其餘部分也是一樣,可能需要花費很大,得到的風險也很大。你很可能會犯一些錯誤。自1999年以來,已經有89373個CVE(公共漏洞和暴露)發布了。而其中公開的大部分的發現者都是那些非常聰明的人。

你可能認為處理一個簡單的用例(例如驗證用戶的密碼)是很簡單的事情——你所做的一切只是比較一對字符串。這樣想就錯了。你需要驗證密碼的哈希值,審核嘗試登錄的次數,減少針對字典的攻擊,這只是冰山一角。你最好的選擇是使用現有的成熟的庫或框架,例如Apache的Shiro或者SpringSecurity,讓這些框架去處理各類複雜的安全問題。

2. Use TLS, Always! 永遠使用TLS!

現在已經是2017年了,所有的網站都應該使用HTTPS了,甚至是公司的內網。Let’s encrypt讓HTTPS變得輕鬆和簡單,這意味著你能不再使用不安全的自籤密鑰了!你甚至可以在本地設置帶證書認證的TomcatNginx實例。

能讓你的應用需要TLS(HTTPS/SSL)只需要簡單的一行代碼,所有人都應該這樣做!如果使用Apache Shiro框架,只需要設置屬性:

[urls]/** = ssl

如果使用Spring Security,,只需要在設置HttpSecurity時,簡單調用一個方法即可。

http.requiresChannel() .anyRequest().requiresSecure();

在Spring Boot中,僅需設置一些屬性,如下:

server.port=8443

server.ssl.key-store=classpath:keystore.jks

server.ssl.key-store-password=secret

server.ssl.key-password=another-secret

使用Spring Boot創建Web Service

Spring Boot是Spring平臺的一個簡化,能讓編寫Spring應用變得很簡單,例如能用很少的代碼,編寫《app應用中考慮的12個因素》一文中提到的觀點。如果你還在使用建War包的方式編碼,那麼Spring Boot值得你去學習。使用Spring Boot可以複雜的、不同類型的應用,例如可以使用簡單的註解(@EnableResourceServer)就搭建一個OAuth資源伺服器,或者通過簡單的屬性改變其埠:

server.port = 8090

如果不喜歡使用SpringBoot,那麼可以使用Dropwizard去搭建JAX-RS技術棧。

監視應用和性能指標

如果無任何數據的情況下是很難發現程序的錯誤的。Spring Boot通過使用Actuator,能讓收集指標數據變得容易,只需要在應用中增加一個依賴,如下:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>`

然後就可以通過瀏覽器中,在訪問應用地址後輸入/health 或者/metrics去檢查應用的健康情況或者指標。Dropwizard框架通過/healthcheck和/metrics實現同樣的功能。

下面是Spring Boot應用通過/metrics 輸出的結果:

{ "classes": 7704, "classes.loaded": 7704, "classes.unloaded": 0, "counter.status.200.metrics": 1, "gauge.response.metrics": 99.0, "gc.ps_marksweep.count": 2, "gc.ps_marksweep.time": 272, "gc.ps_scavenge.count": 8, "gc.ps_scavenge.time": 136, "heap": 3728384, "heap.committed": 470016, "heap.init": 262144, "heap.used": 207793, "httpsessions.active": 0, "httpsessions.max": -1, "instance.uptime": 25020, "mem": 529086, "mem.free": 262222, "nonheap": 0, "nonheap.committed": 60608, "nonheap.init": 2496, "nonheap.used": 59067, "processors": 8, "systemload.average": 5.56103515625, "threads": 24, "threads.daemon": 22, "threads.peak": 28, "threads.totalStarted": 32, "uptime": 37182}

保護敏感信息

人們都認為API密鑰是不安全的,這是事實。密鑰通過電子郵件發送或原始碼管理系統控制。也許這是它們看起來比密碼更不安全的原因,但它們也一樣敏感。如果需要將API密鑰存儲在文件中,請確保授予文件有限的訪問權限。例如,我們建議在私人目錄

中存放Okta的YAML文件並且賦予文件所有者只讀權限。

$ chmod u=r,go-rwx ~/.okta/okta.yaml

如果你正為使用你的APP的用戶創建API,記得提醒他們,如果無設置好權限的話,.SSH的忽文件是放在你的~/.ssh目錄下,如果無設置好權限的話。GitHub 把它們放在「危險區域」,以提醒用戶,這是十分有用的。

相關焦點

  • smart-doc 1.9.7 發布,Java 零註解文檔生成工具
    smart-doc是一款同時支持java restful api和apache dubbo rpc接口文檔生成的工具
  • 「JAVA」萬字長篇詳述字節碼對象與反射機制完成動態編程
    Java 反射在Java的開發環境中,運行java文件需要使用:java xx.java 命令,運行java命令後根據JVM規範,Java 程序的整個生命周期會經歷5個階段:加載 -> 連結(驗證、準備、解析) -> 初始化 -> 使用 -> 卸載;因為在連結階段會有驗證、準備、解析三個步驟,所以也可以說Java 程序的生命周期會經歷7個階段(使用驗證、準備、解析三個步驟來替代連結階段)。
  • 俠說java8-LocalDateTime等時間使用手冊(全),先mark後看
    前言java8的時間日期api給我們提供了極大的便利。如何更好的熟悉使用時間api也是學習java8的一個很重要的知識點,下面我們一起來學習學習。本篇文章代碼比較多,可以作為工具,需要使用時,再來查閱。目錄1.普通Date時間如何轉為LocalDateTime?
  • Java 生成隨機數的 5 種方式,你知道幾種?
    關注公眾號Java技術棧回復 java 獲取更多 Java 工具類教程。 不是直接用 實例化,而是第一次使用其靜態方法 得到 實例,然後調用 類提供的方法獲得各種隨機數。 使用: 結果: 4. java.Security.SecureRandom 也是繼承至 java.util.Random。
  • java基礎教程:Collection集合,Collection 常用API
    集合概述在前面基礎班我們已經學習過並使用過集合ArrayList<E> ,那麼集合到底是什麼呢?集合:集合是java中提供的一種容器,可以用來存儲多個數據。集合和數組既然都是容器,它們有什麼區別呢?數組的長度是固定的。集合的長度是可變的。
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • getty 發布,一個完全基於 java 實現的 aio 框架
    3、本人對netty比較喜歡,無論是其性能還是編程思想(JBOSS提供的一個java開源網絡框架,可以說是java網絡通訊裡的一哥,極其穩定和強大的性能使得被廣泛使用)4、有了netty為何還要自己造輪子?這裡有兩個原因,其一是本人就喜歡造輪子,這是病,改不了。
  • Java API + Python AI,實現跨平臺任務調度
    API接口服務├── controller│ └── CheckController.java├── mq│ └── MqService.java│ └── MqConsumer.java3,MqConsumer.java接收任務處理狀態消息,使用的是發布訂閱消息Topic4,配置完成後,啟動API服務,運行單元測試驗證消息發送接收功能5,API服務接收到的狀態信息四,AI業務處理服務
  • (提高Java代碼質量)|25個優化Java代碼的小技巧
    反例:4.集合初始化儘量指定大小java 的集合類用起來十分方便,但是看源碼可知,集合也是有大小限制的。每次擴容的時間複雜度很有可能是 O(n) ,所以儘量指定可預知的集合大小,能減少集合的擴容次數。反例:正例:5.字符串拼接使用 StringBuilder一般的字符串拼接在編譯期 java 會進行優化,但是在循環中字符串拼接,java 編譯期無法做到優化,所以需要使用 StringBuilder 進行替換。
  • Java開發人員必知必會的20種常用類庫和API
    雖然可以使用java.net包類,但是這和直接使用像Apache HttpClient和HttpCore等開源類庫比起來麻煩太多了。但是在java項目中需要把資料庫連接池的類庫導入到應用中。十、消息傳遞庫像日誌和資料庫連接池一樣,消息傳遞也是很多實際的Java項目中必備的。Java提供了JMS Java消息服務,但這不是JDK的一部分,你需要單獨的引入jms.jar。
  • Java 反射最佳實踐
    點擊上方公眾號,可快速關注)來源:@天之界線2010,github.com/tianzhijiexian/Android-Best-Practices/blob/master/2015.9/reflect/reflect.md如有好文章投稿,請點擊 → 這裡了解詳情概要:最簡單優雅的使用反射
  • Java transient關鍵字使用小記
    1.transient的作用及使用方法我們都知道一個對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable接口,這個類的所有屬性和方法都會自動序列化。
  • 如何使用JAVA反射/JAVA反射實例
    JAVA反射技術,在平時我們的開發中雖然很少會用到例如讀取配製文件可能就用到這個技術,但在我們所使用的框架源碼中是經常會用到的。   e.printStackTrace() ;  }  System.out.println(per) ; // 內容輸出,調用toString() }};4、使用實例
  • 使用C#的後端Web API:循序漸進教程
    首先,當我們使用C#時,您需要使用Microsoft Visual Studio(您可以在Microsoft官方網站上獲取它)。此外,您還需要啟用IIS(Internet信息服務)。name = "Cairon Reynolds", email = "email5@mail.com", phone = "01111111", role = 3}};// GET: api/Users[ResponseType(typeof(IEnumerable<User>))]
  • 5分鐘!用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • 5分鐘!用Java實現目標檢測 | PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。
  • StepChain 0.0.7 發布,Java 通用業務處理框架
    5、支持配置中心、緩存、統一數據接口、redis、Es、日誌Trace等。6、支持並行分支,支持條件分支if/else、switch、loop子流程.7、支持Processor定時調度FixedRate、FixedDelay。備註:只開源了通用部分(不影響使用),去除了有關框架組件包括:配置中心、緩存中心、數據接口以及業務相關DataMiddle等部分API。
  • java之數組作為方法參數的使用
    各位小夥伴們大家好,這次小編要介紹的是java作為方法參數,返回值的使用。首先,小編要介紹的是java作為方法參數的使用。int[] array*/public static void printArray(int[] array){System.out.println(array);//printArray方法收到的參數:地址值for(int i=0;i<array.length;i++){//數組的遍歷System.out.println(array[i]);}}}在數組作為方法參數使用的時候,
  • Java中Lambda表達式的5種不同語法
    1.標準語法考慮以下示例:String[] arr = {"program", "creek", "is", "a", "java", "site"};Arrays.sort在這種情況下,它是一個單一表達式-Integer.compare(m.length(), n.length())Output:[a, is, java, site, creek, program]2.可以推斷參數類型
  • C/C++、Java、JavaScript、PHP、Python分別用來開發什麼?
    同時,Java在手機領域也有一席之地, 在普遍智能化之前, 很多手機就是以支持java應用作為賣點的,而智慧型手機爆發之後, Java手機主場變成了Android,作為安卓的標準程式語言而存。總結:Java:網頁, 企業級開發, 普通應用軟體, 遊戲後臺。