最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

HttpServletRequestWrapper干預(yù)Request處理流程解析

 更新時間:2023年09月21日 09:59:37   作者:晴天哥_王志  
這篇文章主要分析在?Tomcat的處理?http?請求的流程中干預(yù)?Request對象,?通過基于HttpServletRequestWrapper和?Filter組合進(jìn)行干預(yù),有需要的朋友可以借鑒參考下,希望能夠有所幫助

開篇

Tomcat 處理 http 請求的過程中 Request 對象是RequestFacade對象(可以通過 springBoot 中跟蹤tomcat-embed-core 的包進(jìn)行跟蹤),干預(yù)后會設(shè)配成HttpServletRequestWrapper的子類對象進(jìn)行傳遞。

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對象)強(qiáng)轉(zhuǎn)成HttpServletRequest后創(chuàng)建WrapperDemo對象后進(jìn)行 Filter 的后續(xù)過濾,后續(xù) Filter 操作的 Request 對象是WrapperDemo對象。
  • servletRequest(RequestFacade對象)能夠強(qiáng)轉(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處理流程解析的詳細(xì)內(nèi)容,更多關(guān)于HttpServletRequestWrapper干預(yù)Request的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java8優(yōu)雅的字符串拼接工具類StringJoiner實例代碼

    Java8優(yōu)雅的字符串拼接工具類StringJoiner實例代碼

    這篇文章主要給大家介紹了關(guān)于Java8優(yōu)雅的字符串拼接工具類StringJoiner的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • springboot的@Value中#和$區(qū)別詳解

    springboot的@Value中#和$區(qū)別詳解

    這篇文章主要介紹了springboot的@Value中#和$區(qū)別詳解,@Value注解的作用主要可以給屬性直接賦值、也可以讀取配置文件中的值給屬性賦值,需要的朋友可以參考下
    2023-11-11
  • 深入理解java的異常情況

    深入理解java的異常情況

    在本篇文章里小編給大家分享了關(guān)于Java的異常類型的相關(guān)知識點內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下,希望能夠給你帶來幫助
    2021-09-09
  • Java編碼摘要算法實例解析

    Java編碼摘要算法實例解析

    這篇文章主要介紹了Java編碼摘要算法實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java調(diào)用UniHttp接口請求失敗的三種解決策略

    Java調(diào)用UniHttp接口請求失敗的三種解決策略

    在當(dāng)今數(shù)字化時代,不管是內(nèi)部系統(tǒng)之間還是跟外部系統(tǒng)的對接,接口調(diào)用已成為軟件開發(fā)中不可或缺的一部分,本文主要介紹了Java調(diào)用UniHttp接口請求失敗的三種解決策略,希望對大家有所幫助
    2025-09-09
  • MyBatis-Plus?條件查詢器的實現(xiàn)

    MyBatis-Plus?條件查詢器的實現(xiàn)

    本文主要介紹了MyBatis-Plus?條件查詢器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • RocketMQ消息隊列實現(xiàn)隨機(jī)消息發(fā)送當(dāng)做七夕禮物

    RocketMQ消息隊列實現(xiàn)隨機(jī)消息發(fā)送當(dāng)做七夕禮物

    這篇文章主要為大家介紹了RocketMQ消息隊列實現(xiàn)隨機(jī)消息發(fā)送當(dāng)做七夕禮物,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java調(diào)用Python的四種方法小結(jié)

    Java調(diào)用Python的四種方法小結(jié)

    在現(xiàn)代開發(fā)中,結(jié)合不同編程語言的優(yōu)勢往往能達(dá)到事半功倍的效果,本文將詳細(xì)介紹四種在Java中調(diào)用Python的方法,并推薦一種最常用且實用的方法,希望對大家有一定的幫助
    2025-05-05
  • 一文弄懂java中POJO和bean區(qū)別

    一文弄懂java中POJO和bean區(qū)別

    本文主要介紹了一文弄懂java中POJO和bean區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10
  • springboot接入deepseek深度求索代碼示例(java版)

    springboot接入deepseek深度求索代碼示例(java版)

    這篇文章主要介紹了springboot接入deepseek深度求索的相關(guān)資料,包括創(chuàng)建APIKey,封裝詢問工具方法,傳入問題,調(diào)用方法,但發(fā)現(xiàn)只能回答簡單問題,需要的朋友可以參考下
    2025-01-01

最新評論

镇巴县| 兰西县| 湖州市| 邯郸市| 马尔康县| 应城市| 葫芦岛市| 江津市| 临城县| 潜山县| 丁青县| 深州市| 咸宁市| 兴业县| 开原市| 奉化市| 岳普湖县| 乌兰浩特市| 富民县| 荆门市| 霍林郭勒市| 海丰县| 祁阳县| 信宜市| 澄迈县| 西青区| 民和| 和静县| 昂仁县| 墨竹工卡县| 甘南县| 资讯 | 钟山县| 溧水县| 平山县| 徐水县| 筠连县| 朝阳县| 宁晋县| 临安市| 抚远县|