ApacheTomcat解析请求参数的过程
今天幫小伙伴解決了一個請求參數亂碼問題,大概花費2個小時吧,要不是前段時間自己稍微花時間看了看spring mvc框架的源碼,估計今天要花好長時間解決這個問題了。起先我讓小伙伴試試利用tomcat源碼來進行調試一下,小伙伴感覺有些吃力,就交給我幫忙解決一下,還好幫他搞定了這個問題。
tomcat的參數解析涉及到如下幾個類:
org.apache.coyote.Request
低級別類,用于包裝socket的請求了。
org.apache.tomcat.util.http.Parameters
集中存放解析的參數,post請求參數個get請求的參數
org.apache.catalina.connector.RequestFacade
請求門面,包裝請求,是請求的實現類,但其實是誰的門面呢?是coyoteRequest,
springmvc框架會調用request的getParameterValues方法,而這個方法又調用實際的coyoteRequest的getParameterValues方法,這個方法會首先判斷以前是否已經解析過參數了,如果沒有解析參數,那么就發生第一次解析參數的操作。
調用parseParameters方法解析所有的參數,包括url的參數,這個函數里面,會調用Rquest類的getParameters方法,你敢相信,每當來一個請求,就創建一個Request對象,我們的參數就預先創建放到Request對象里面了。
獲得Parameters對象,則要解析url里面的參數,還要解析請求體里面的參數。一個參數一個參數地解析,每解析一個就存放到paramHashValues對象里面。這個對象是個HashMap對象。
小伙伴出現亂碼的原因就是Filter放置的順序有些問題,設置編碼的Filter應該放置在第一個位置,首先進行配置編碼,而小伙伴的這個Filter放在了一個XSS處理的Filter的后面,可想而知,XSS提前進行了參數解析,沒有使用UTF-8編碼,然后緩存了起來,后續設置編碼的Filter沒有起到任何作用,從而發生了亂碼問題。
網絡程序真是io密集型的啊,解析參數并非簡簡單單,基本上就是從socket里面取數據,都是一個字節一個字節的解析的。具體的參數格式啥的,我們就不深究了,感覺沒有必要啊,到時候有時間再進行集中式的回顧學習,加深對java web程序的理解和掌握。
感覺針對我們開發常用的開發框架,還是要稍微了解點源碼,否則,面對陌生的源碼環境,感覺未必能在非常短的時間內解決問題啊。
?
轉載于:https://www.cnblogs.com/weiguangyue/p/9374512.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ApacheTomcat解析请求参数的过程的全部內容,希望文章能夠幫你解決所遇到的問題。