諾冰羽的虛擬世界
jsoup 是一款 Java 的HTML 解析器,可直接解析某個URL地址、HTML文字內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於JQuery的操作方法來取出和操作資料。 、
解析一段html文字:
它是通過Parser這個解析器來解析的,我們一般在使用的時候會Jsoup.parse()傳入一段html文字然後它會生成一個document並返回這個document物件,然後我們可以通過select(),getElementsByClass,getELementsByTag,getElementById等方法來獲取到html某個的node節點,比如getElementsByClass,它就會查詢包含這個類的元素,包括在這個元素下的元素,並且不區分大小寫。在這個方法內部是通過Collector.collect方法來訪問根和根的所有子代,並根據評估器測試它,構建一個元素列表,評估器的作用是計算元素是否與選擇器匹配,並且在collect方法中會建立一個遍歷器NodeTraversor,並呼叫它的traverse來對傳入節點進行深度優先遍歷,最終collect會返回一個Elements物件,這樣一段html文字就算是做了一次粗略的解析過濾了。然後假如我們只想要獲取到某個節點的某個細節的內容,我們可以再通過剛剛獲取到的Elements物件對它進行遍歷,Elements其實是一個ArrayList,它是繼承ArrayList的,所以我們可以通過它裡面的元素去呼叫getElementsByClass,getELementsByTag,getElementById等方法來獲取當前元素下的元素,或者我們要獲取的細節就在當前元素下我們就可以通過當前元素呼叫text()方法來獲取當前元素中的文字資訊,呼叫attr方法並傳入一個key值來獲取對應的value值。並且可以發現document和Element在訪問它們的下層元素的時候存在很多相同的方法,這是因為它們都是Node這個抽象類的實現,所以使得它們有很多的相同表現,jsoup中Node的設計可以看出來和html的結構十分貼合。
解析URL:
Jsoup有一個connect(String url) 方法建立一個新的 Connection,然後呼叫它的get()方法可以獲取到一個document檔案。connect方法內部 呼叫了HttpConnection.connect(url)方法,其實也就是進行了一個對URL進行了get請求然後又把返回的html文字轉成了document檔案,然後步驟和上面過程一致。
Jsoup的效能優點:①不依賴於第三方庫,jvm開銷小。
②它提供的選擇器:jsoup elements物件支援類似於CSS (或jquery)的選擇器語法,來實現非常強大和靈活的查詢功能。這個select 方法在Document, Element,或Elements物件中都可以使用。且是上下文相關的,因此可實現指定元素的過濾,或者鏈式選擇訪問。
③消除不受信任的HTML (來防止XSS攻擊):XSS又叫CSS (Cross Site Script) ,跨站指令碼攻擊。它指的是惡意攻擊者往Web頁面裡插入惡意html程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html程式碼會被執行,從而達到惡意攻擊使用者的特殊目的。XSS屬於被動式的攻擊,因為其被動且不好利用,所以許多人常忽略其危害性。所以我們經常只讓使用者輸入純文字的內容,但這樣使用者體驗就比較差了。
一個更好的解決方法就是使用一個富文字編輯器WYSIWYG如CKEditor 和 TinyMCE。這些可以輸出HTML並能夠讓使用者視覺化編輯。雖然他們可以在客戶端進行校驗,但是這樣還不夠安全,需要在伺服器端進行校驗並清除有害的HTML程式碼,這樣才能確保輸入到你網站的HTML是安全的。否則,攻擊者能夠繞過客戶端的Javascript驗證,並注入不安全的HMTL直接進入您的網站。
jsoup的whitelist清理器能夠在伺服器端對使用者輸入的HTML進行過濾,只輸出一些安全的標籤和屬性。
jsoup提供了一系列的Whitelist基本配置,能夠滿足大多數要求;但如有必要,也可以進行修改,不過要小心。
這個cleaner非常好用不僅可以避免XSS攻擊,還可以限制使用者可以輸入的標籤範圍。