關於Filter中ServletRequest強轉HttpServletRequest問題
什麼是ServletRequest 和ServletResponse
ServletRequest由Servlet容器來管理,當客戶請求到來時,容器建立一個ServletRequest物件,封裝請求資料,同時建立一個ServletResponse物件,封裝響應資料。這兩個物件將被容器作為service()方法的引數傳遞給Servlet,Servlet利用ServletRequest物件獲取客戶端發來的請求資料,利用ServletResponse物件傳送響應資料。
而在過濾器中有這樣的程式碼:
我們知道我們對子類實現進行向上轉型得到父類物件是安全的,因為子類會完全繼承父類的方法,我們向上轉型為父類,當我們呼叫父類的方法其實在子類實現中是能完全找到的。反之向下轉型是不安全的,我們子類除了完全繼承父類的方法外還會擴充自己的方法,所以我們在呼叫子類方法時可能在父類實現中是找不到的,所以向下轉型不安全。
但是在過濾器中,我們經常這樣使用。這是為何?
HttpServletRequest和ServletRequest都是介面,他們都只是定義了方法卻沒有提供相關實現。所以我們看到的ServletRequest request中的request物件其實並不是我們ServletRequest 的一個具體實現。
這裡主要看request 物件的具體實現類究竟是繼承的哪個介面,如果繼承自HttpServletRequest介面那麼我們向下轉型使用HttpServletRequest介面的方法就是安全的。測試如下:
證明我們的request物件的確是HttpServletRequest的一個例項。
也就是說doFilter的引數request物件的生成方式不是ServletRequest request = new ServletRequest();這種形式,而是ServletRequest request = new HttpServletRequest();這種形式,引數裡的request不是父類ServletRequest的物件,而是HttpServletRequest的上轉型物件
再說一下為什麼在Filter裡要強制轉換?
答:ServletRequest request;這個是將子類物件賦給父類引用,他執行時的型別是子類,編譯時的型別是父類,但是在執行時,父類型別物件呼叫的方法如果子類裡面有,那就執行子類裡面的方法,如果編譯時的型別也就是父類沒有呼叫的那個方法,則報錯。所以在那裡要做一個強制型別轉換,否則就會報錯。
相關文章
- 關於 a 標籤跳轉問題
- 關於轉義符 在php正則中的匹配問題PHP
- The method getWriter() is undefined for the type HttpServletRequest的問題UndefinedHTTPServlet
- 關於Java中進位制轉換以及位運算問題Java
- 關於工作中遇到的問題
- 關於cuda中的函式問題函式
- 關於python中填充缺失值的問題Python
- 關於setInterval和setTImeout中的this指向問題
- 關於 mysql 中的 rand () 查詢問題MySql
- Stream中filter過濾條件問題記錄Filter
- 關於java.net.URLEncoder.encode()將空格轉成+問題Java
- Leetcode刷題中關於java的一些小問題LeetCodeJava
- 關於this指向的問題
- 關於跨域問題跨域
- .Net Core—-關於MVC中TempData持久化問題MVC持久化
- SpringBoot中關於Mybatis使用的三個問題Spring BootMyBatis
- Elasticsearch中關於transform的一個問題分析ElasticsearchORM
- [20211018]運維中關於history的問題.txt運維
- 關於ubuntu安裝中過程遇到問題Ubuntu
- (轉載)關於usr/bin/ld: cannot find -lxxx問題總結
- 關於 iconv 轉碼導致資料丟失的問題
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- 轉賬問題是屬於業務問題還是屬於技術問題?
- 關於盒模型相關的問題模型
- [20191202]關於hugepages相關問題.txt
- 關於 go-micro 相關問題Go
- 關於 Android studio 在xml中不提示的問題AndroidXML
- Java中關於二分查詢的問題Java
- 關於JQuery操作checkbox問題jQuery
- 關於rem佈局問題REM
- 關於MQTT 使用遇到問題MQQT
- 關於DrawerLayout的小問題
- 關於javascript的this指向問題JavaScript
- 關於並查集問題並查集
- 關於 swoole 除錯問題除錯
- 關於django跨域問題Django跨域
- 關於 Puerts 的效能問題
- 關於dcat-admin問題