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

Spring?MVC內(nèi)置過濾器功能示例詳解

 更新時(shí)間:2023年09月15日 09:17:33   作者:福  
這篇文章主要為大家介紹了Spring?MVC內(nèi)置過濾器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

SpringMVC內(nèi)置如下過濾器

  • Form Data
  • Forwarded Headers
  • Shallow ETag
  • CORS

Form Data

瀏覽器可以通過HTTP GET或HTTP POST提交form data(表單數(shù)據(jù)),但是非瀏覽器客戶端可以通過HTTP PUT、HTTP DELETE、HTTP PATCH提交表單數(shù)據(jù)。但是Servlet規(guī)范約定,通過Servlet API的ServletRequest.getParameter*()系列接口只能獲取到HTTP POST提交的表單數(shù)據(jù)。

所以,通過其他方式提交的表單數(shù)據(jù)就獲取不到。

SpringMVC提供了一個(gè)解決該上述問題的方案,就是FormContentFilter過濾器,F(xiàn)ormContentFilter 是SpringMVC的內(nèi)置過濾器,配置后立即生效,可以把除POST的其他方法提交上來的表單數(shù)據(jù)(content type為application/x-www-form-urlencoded)包裝成servletRequest的參數(shù)、從而通過Servlet API的ServletRequest.getParameter*()方法獲取到。

源碼:

@Override
    protected void doFilterInternal(
            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        MultiValueMap<String, String> params = parseIfNecessary(request);
        if (!CollectionUtils.isEmpty(params)) {
            filterChain.doFilter(new FormContentRequestWrapper(request, params), response);
        }
        else {
            filterChain.doFilter(request, response);
        }
    }

解析context type為"application/x-www-form-urlencoded"的body信息獲取到表單數(shù)據(jù)組成params Map,之后將params包裝到FormContentRequestWrapper中的formParams屬性中:

public FormContentRequestWrapper(HttpServletRequest request, MultiValueMap<String, String> params) {
            super(request);
            this.formParams = params;
        }

        @Override
        @Nullable
        public String getParameter(String name) {
            String queryStringValue = super.getParameter(name);
            String formValue = this.formParams.getFirst(name);
            return (queryStringValue != null ? queryStringValue : formValue);
        }

之后調(diào)用HttpServletRequest的getParameter方法會(huì)從formParams中獲取數(shù)據(jù)。

Forwarded Headers

RFC 7239 定義了HTTP Forwarded請求頭來反應(yīng)經(jīng)過代理之后的原始請求頭信息,比如原始請求主機(jī)、端口號等信息。此外,還會(huì)有其他的非標(biāo)準(zhǔn)的轉(zhuǎn)發(fā)頭信息比如:X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto, X-Forwarded-Ssl, X-Forwarded-Prefix等等。

SpringMVC提供了一個(gè)內(nèi)置過濾器ForwardedHeaderFilter,目的是:

  • 改變Forwarded請求頭的host、port等相關(guān)信息
  • 移除這些頭信息,以便消除后續(xù)影響(比如處于安全考慮)

如果配置ForwardedHeaderFilter的參數(shù)removeOnly=true的話,所有forwarded相關(guān)的參數(shù)都會(huì)被移除:

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {

        if (this.removeOnly) {
            ForwardedHeaderRemovingRequest wrappedRequest = new ForwardedHeaderRemovingRequest(request);
            filterChain.doFilter(wrappedRequest, response);
        }

否則,F(xiàn)orwardedHeaderFilter將會(huì)從HTTP Forwarded請求頭中重新構(gòu)建request及response的包裝類,使得包裝類中的請求反應(yīng)HTTP Forwarded中的原始請求信息。因此,后續(xù)的處理從request中拿到的就會(huì)是原始請求的相關(guān)信息。

Shallow ETag

ShallowEtagHeaderFilter是SpringMVC用來處理“弱”ETag的過濾器,配置打開該過濾器后,會(huì)計(jì)算請求內(nèi)容的MD5到response中,下次瀏覽器再次發(fā)送請求的時(shí)候會(huì)通過request的頭信息If-None-Match發(fā)送該MD5數(shù)據(jù),ShallowEtagHeaderFilter會(huì)再次計(jì)算請求內(nèi)容的MD5值并與request頭信息的If-None-Match比較,如果相等的話,則返回前臺(tái)304狀態(tài)碼。

這個(gè)策略會(huì)節(jié)約網(wǎng)絡(luò)帶寬但是不會(huì)節(jié)省CPU計(jì)算,因?yàn)槊看握埱笊蟻碇笳埱髢?nèi)容都需要被計(jì)算一次MD5,如果通過MD5判斷后請求內(nèi)容和上次請求相同的話,只返回304狀態(tài)碼而無需再次返回內(nèi)容。

測試發(fā)現(xiàn)chrome瀏覽器在后臺(tái)發(fā)送Etag回來之后也并不會(huì)發(fā)送If-None-Match,會(huì)導(dǎo)致該過濾器無效,應(yīng)該是需要chrome端做一個(gè)什么設(shè)置,尚未搞定,各位如果需要使用本過濾器的話需要注意。但是換成Edge瀏覽器之后是正常的、可以收到304的。

COR

跨域過濾器CorsFilter,如果不使用Spring Security的話,可以通過CorsFilter進(jìn)行跨域處理。

以上就是Spring MVC 八 - 內(nèi)置過濾器的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC內(nèi)置過濾器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中scheduleAtFixedRate的用法

    Java中scheduleAtFixedRate的用法

    如何正確使用Java中的scheduleAtFixedRate是一篇介紹Java中定時(shí)任務(wù)調(diào)度器的文章。它詳細(xì)介紹了scheduleAtFixedRate方法的用法、參數(shù)及作用,并給出了一些實(shí)例以幫助讀者更好地理解其使用。本文為Java開發(fā)人員提供了一些實(shí)用的技巧,幫助他們更好地管理和控制定時(shí)任務(wù)
    2023-04-04
  • Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例

    Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作,結(jié)合實(shí)例形式分析了Bean定義中的SpEL表達(dá)式語言操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • spring如何通過FactoryBean配置Bean

    spring如何通過FactoryBean配置Bean

    這篇文章主要介紹了spring如何通過FactoryBean配置Bean,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java 關(guān)系運(yùn)算符詳情及案例(下)

    Java 關(guān)系運(yùn)算符詳情及案例(下)

    這篇文章主要介紹了Java 關(guān)系運(yùn)算符詳情及案例的實(shí)現(xiàn),主要續(xù)上篇文章,上一篇文章我們講到“等于”運(yùn)算符 (==)、“不等于”運(yùn)算符(!=)、“大于”運(yùn)算符(>) ,這篇文章繼續(xù)給大家講解相關(guān)知識,需要的朋友可以參考一下
    2021-12-12
  • 詳解spring整合hibernate的方法

    詳解spring整合hibernate的方法

    這篇文章主要介紹了spring整合hibernate的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring Boot使用Druid連接池的示例代碼

    Spring Boot使用Druid連接池的示例代碼

    Druid是Java語言中最好的數(shù)據(jù)庫連接池。這篇文章主要介紹了Spring Boot使用Druid連接池的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 完美解決Eclipse導(dǎo)入的項(xiàng)目上有個(gè)紅叉,但不影響項(xiàng)目運(yùn)行的問題

    完美解決Eclipse導(dǎo)入的項(xiàng)目上有個(gè)紅叉,但不影響項(xiàng)目運(yùn)行的問題

    這篇文章主要介紹了完美解決Eclipse導(dǎo)入的項(xiàng)目上有個(gè)紅叉,但不影響項(xiàng)目運(yùn)行的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java操作透明圖片并保持背景透明的實(shí)現(xiàn)

    Java操作透明圖片并保持背景透明的實(shí)現(xiàn)

    這篇文章主要介紹了Java操作透明圖片并保持背景透明的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 關(guān)于Spring框架中異常處理情況淺析

    關(guān)于Spring框架中異常處理情況淺析

    最近學(xué)習(xí)Spring時(shí),認(rèn)識到Spring異常處理的強(qiáng)大,這篇文章主要給大家介紹了關(guān)于Spring框架中異常處理情況的相關(guān)資料,通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • java解析dbf之通過javadbf包生成和讀取dbf文件

    java解析dbf之通過javadbf包生成和讀取dbf文件

    這篇文章主要介紹了java通過javadbf讀取和生成DBF文件的方法,大家參考使用吧
    2014-01-01

最新評論

定安县| 云阳县| 墨玉县| 呼和浩特市| 霍州市| 津南区| 武邑县| 河东区| 南郑县| 镇坪县| 威远县| 建平县| 泾阳县| 枝江市| 福州市| 玉田县| 余庆县| 平和县| 绥阳县| 汽车| 泌阳县| 沙河市| 友谊县| 河曲县| 胶南市| 志丹县| 泉州市| 安徽省| 自治县| 闵行区| 镇平县| 安乡县| 玉环县| 丰镇市| 永善县| 个旧市| 儋州市| 南京市| 乌兰县| 南川市| 淮滨县|