HttpServletRequestWrapper干預(yù)Request處理流程解析
開篇
Tomcat 處理 http 請求的過程中 Request 對象是RequestFacade對象(可以通過 springBoot 中跟蹤tomcat-embed-core 的包進行跟蹤),干預(yù)后會設(shè)配成HttpServletRequestWrapper的子類對象進行傳遞。
HttpServletRequestWrapper和RequestFacade都實現(xiàn) HttpServletRequest 接口。
Tomcat 處理流程
- Tomcat 的針對 http請求的處理流程如上圖所示,在org.apache.catalina.core.ApplicationFilterChain#doFilter的方法中將org.apache.catalina.connector.Request封裝成了org.apache.catalina.connector.RequestFacade對象。
- 在后續(xù)的ApplicationFilterChain之后的執(zhí)行鏈路中使用的是RequestFacade對象。
Request 分析
Request
package org.apache.catalina.connector; public class Request implements org.apache.catalina.servlet4preview.http.HttpServletRequest { } ------------------------------ package org.apache.catalina.servlet4preview.http; public interface HttpServletRequest extends javax.servlet.http.HttpServletRequest { public ServletMapping getServletMapping(); public PushBuilder newPushBuilder(); } ------------------------------ package javax.servlet.http; public interface HttpServletRequest extends ServletRequest { } ---------------------------------------- package javax.servlet; public interface ServletRequest { }
- Request 實現(xiàn)了javax.servlet.ServletRequest接口
- Request 實現(xiàn)了javax.servlet.http.HttpServletRequest接口
RequestFacade
package org.apache.catalina.connector; public class RequestFacade implements HttpServletRequest { public RequestFacade(Request request) { this.request = request; } protected Request request = null; } ------------------------------------- package org.apache.catalina.servlet4preview.http; public interface HttpServletRequest extends javax.servlet.http.HttpServletRequest { public ServletMapping getServletMapping(); public PushBuilder newPushBuilder(); } ------------------------------------- package javax.servlet.http; public interface HttpServletRequest extends ServletRequest { } ---------------------------------------- package javax.servlet; public interface ServletRequest { }
- RequestFacade 實現(xiàn)了javax.servlet.ServletRequest接口
- RequestFacade 實現(xiàn)了javax.servlet.http.HttpServletRequest接口
HttpServletRequestWrapper
package javax.servlet.http; public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest { public HttpServletRequestWrapper(HttpServletRequest request) { super(request); } } ---------------------------------------- package javax.servlet; public class ServletRequestWrapper implements ServletRequest { private ServletRequest request; public ServletRequestWrapper(ServletRequest request) { if (request == null) { throw new IllegalArgumentException("Request cannot be null"); } this.request = request; } } ---------------------------------------- package javax.servlet; public interface ServletRequest { }
- HttpServletRequestWrapper 實現(xiàn)了javax.servlet.ServletRequest接口
Request 改寫 Demo
import org.springframework.stereotype.Component; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException; @Component public class WrapperFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("wrapper filter init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { WrapperDemo wrapperDemo = new WrapperDemo((HttpServletRequest)servletRequest); filterChain.doFilter(wrapperDemo, servletResponse); } @Override public void destroy() { System.out.println("wrapper filter init"); } } --------------------------------- class WrapperDemo extends HttpServletRequestWrapper { public WrapperDemo(HttpServletRequest request) { super(request); } }
- 自定義類WrapperDemo繼承HttpServletRequestWrapper,改寫getParameter相關(guān)的方法。
- 自定義WrapperFilter,在doFilter方法內(nèi)部將servletRequest(RequestFacade對象)強轉(zhuǎn)成HttpServletRequest后創(chuàng)建WrapperDemo對象后進行 Filter 的后續(xù)過濾,后續(xù) Filter 操作的 Request 對象是WrapperDemo對象。
- servletRequest(RequestFacade對象)能夠強轉(zhuǎn)成HttpServletRequest的原因是RequestFacade 實現(xiàn)了javax.servlet.http.HttpServletRequest接口。
- HttpServletRequestWrapper屬于HttpServletRequest的封裝類,內(nèi)部實現(xiàn)了所有HttpServletRequest的方法。
ServletWebRequest參數(shù)獲取
at org.apache.catalina.connector.Request.getParameter(Request.java:1140) at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:153) at org.springframework.web.context.request.ServletWebRequest.getParameter(ServletWebRequest.java:154)
- ServletWebRequest獲取參數(shù)的流程本質(zhì)上執(zhí)行的是org.apache.catalina.connector.Request.getParameter的實現(xiàn)。
- 不管是 RequestFacade 或 ServletRequestWrapper等對請求的操作都是由org.apache.catalina.connector.Request.getParameter實現(xiàn)的。
以上就是HttpServletRequestWrapper干預(yù)Request處理流程解析的詳細內(nèi)容,更多關(guān)于HttpServletRequestWrapper干預(yù)Request的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java對象以Hash結(jié)構(gòu)存入Redis詳解
這篇文章主要介紹了Java對象以Hash結(jié)構(gòu)存入Redis詳解,和Java中的對象非常相似,卻不能按照Java對象的結(jié)構(gòu)直接存儲進Redis的hash中,因為Java對象中的field是可以嵌套的,而Redis的Hash結(jié)構(gòu)不支持嵌套結(jié)構(gòu),需要的朋友可以參考下2023-08-08springboot如何開啟和關(guān)閉kafka消費
在Kafka消費者中,通過關(guān)閉自動消費配置,使用自定義容器工廠,并在消費監(jiān)聽器上設(shè)置id,可以手動控制消費的開啟和關(guān)閉,這是根據(jù)個人經(jīng)驗總結(jié)的方法,旨在幫助其他開發(fā)者2024-12-12spring?boot對敏感信息進行加解密的項目實現(xiàn)
本文主要介紹了spring?boot對敏感信息進行加解密的項目實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04IDEA修改java文件后 不用重啟Tomcat服務(wù)便可實現(xiàn)自動更新
這篇文章主要介紹了IDEA修改java文件后 不用重啟Tomcat服務(wù)便可實現(xiàn)自動更新,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11springboot接收excel數(shù)據(jù)文件去重方式
文章主要介紹了如何在Spring?Boot中實現(xiàn)文件上傳并入庫的功能,包括讀取Excel文件、生成Entity對象、使用MergeInto語句進行數(shù)據(jù)庫操作以及注意事項2024-12-12Spring data jpa的使用與詳解(復(fù)雜動態(tài)查詢及分頁,排序)
這篇文章主要介紹了Spring data jpa的使用與詳解(復(fù)雜動態(tài)查詢及分頁,排序),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11