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

Springboot中路徑參數(shù)帶 (%2F)的問題徹底解決方案

 更新時(shí)間:2023年06月25日 09:18:56   作者:KevinDai007  
這篇文章主要介紹了徹底解決Springboot中路徑參數(shù)帶(%2F)的問題,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

徹底解決Springboot中路徑參數(shù)帶/(%2F)的問題

背景

前兩天突然出現(xiàn)了一個線上問題,有同事反應(yīng)我提供的接口報(bào)400的錯誤。接口路徑如下 PATCH /v1/basic/owners/{owner_code}/skus/{sku},經(jīng)過排查發(fā)現(xiàn)是sku參數(shù)中有/因此springboot轉(zhuǎn)義后直接報(bào)錯了。由于已經(jīng)有很多團(tuán)隊(duì)對接了相關(guān)接口,且有很多的其他接口都使用了類似的傳參方式,因此需要考慮怎么在系統(tǒng)中不讓springboot自動解碼

解決方案

我先列出可用的解決方案,然后在列出網(wǎng)上常見錯誤方案

在項(xiàng)目中添加環(huán)境變量

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");

在這里插入圖片描述

1.關(guān)閉spring自動decode url的開關(guān)

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

1.開啟Spring security中允許url中存在/的功能(如果項(xiàng)目中沒有用到Spring security 可跳過此配置)

@Order(Ordered.LOWEST_PRECEDENCE)
@Configuration
public class SecurityFirewallConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
        DefaultHttpFirewall firewall = new DefaultHttpFirewall();
        firewall.setAllowUrlEncodedSlash(true);
        return firewall;
    }
}

注意大部分項(xiàng)目中都有Spring security相關(guān)的設(shè)置,所以這里注意一下優(yōu)先級

在項(xiàng)目中配置好這三項(xiàng)后,url中的參數(shù)已經(jīng)可以正常解析了(注意需要讓接口使用法把帶/的參數(shù)encode之后再調(diào)用我們的接口)

在這里插入圖片描述

在這里插入圖片描述

常見的錯誤答案

1.使用正則匹配獲取參數(shù)

@PostMapping("/v1/basic/owner-code/{ownerCode}/skus/{sku:.+}/ext-info")
public ResponseEntity<String> getInfo(@PathVariable("ownerCode") String ownerCode, @PathVariable("sku") String sku) {
    // your logic here
}

這里的.+只是一個示例,還有很多種正則的寫法。這是很多人的博客中被提及的方案,但并不能解決問題

1.覆蓋Spring MVC默認(rèn)URL解碼行為的配置類

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper() {
            @Override
            public Map<String, String> decodePathVariables(HttpServletRequest request, Map<String, String> vars) {
                return vars;
            }
        };
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

看起來很有效,實(shí)際上也不行

1.使用@MatrixVariable接受參數(shù)

@PostMapping("/v1/basic/owner-code/{ownerCode}/skus/{sku:.+}/ext-info")
public ResponseEntity<String> getInfo(@PathVariable("ownerCode") String ownerCode, @MatrixVariable("sku") String sku) {
    // your logic here
}

1.自定義filter并添加到spring中

public class UrlEncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        String url = request.getRequestURL().toString();
        // 如果你的SKU部分總是在URL的特定位置,可以使用這種方式來找到它并進(jìn)行二次編碼
        String encodedUrl = url.replace("skus/", "skus/").replace("/ext-info", "%2Fext-info");
        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {
            @Override
            public StringBuffer getRequestURL() {
                return new StringBuffer(encodedUrl);
            }
        };
        chain.doFilter(requestWrapper, res);
    }
}

到此這篇關(guān)于徹底解決Springboot中路徑參數(shù)帶 (%2F)的問題的文章就介紹到這了,更多相關(guān)Springboot路徑參數(shù)帶 (%2F)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • AspectJ的基本用法

    AspectJ的基本用法

    本文主要介紹了AspectJ的基本用法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • javaweb文件打包批量下載代碼

    javaweb文件打包批量下載代碼

    這篇文章主要為大家詳細(xì)介紹了javaweb文件打包批量下載代碼,批量下載未批改作業(yè),感興趣的小伙伴們可以參考一下
    2016-06-06
  • IDEA常量字符串過長問題及解決方案

    IDEA常量字符串過長問題及解決方案

    在編譯Java項(xiàng)目時(shí)遇到“常量字符串過長”錯誤,可以通過修改編譯器設(shè)置解決,具體方法是進(jìn)入IDE的設(shè)置(File>>Settings>>Build, Execution, Deployment>>Compiler>>Java Compiler),將使用的編譯器更改為Eclipse,如果問題依舊
    2024-10-10
  • 詳解Java使用super和this來重載構(gòu)造方法

    詳解Java使用super和this來重載構(gòu)造方法

    這篇文章主要介紹了詳解Java使用super和this來重載構(gòu)造方法的相關(guān)資料,這里提供實(shí)例來幫助大家理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Spring?緩存在項(xiàng)目中的使用詳解

    Spring?緩存在項(xiàng)目中的使用詳解

    Spring?緩存機(jī)制,Cache接口為緩存的組件規(guī)范定義,包擴(kuò)緩存的各種操作(添加緩存、刪除緩存、修改緩存等),本文給大家介紹Spring?緩存在項(xiàng)目中的使用,感興趣的朋友一起看看吧
    2025-05-05
  • 深入剖析Java中的synchronized關(guān)鍵字

    深入剖析Java中的synchronized關(guān)鍵字

    在 Java 程序中,我們可以利用 synchronized 關(guān)鍵字來對程序進(jìn)行加鎖,它既可以用來聲明一個 synchronized 代碼塊,也可以直接標(biāo)記靜態(tài)方法或者實(shí)例方法,本文就帶大家深入了解Java中的synchronized關(guān)鍵字,感興趣的同學(xué)可以參考閱讀
    2023-06-06
  • java中各種類型用Stream流求最大值最小值方式

    java中各種類型用Stream流求最大值最小值方式

    這篇文章主要介紹了java中各種類型用Stream流求最大值最小值方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • IDEA如何實(shí)現(xiàn)查看UML類圖

    IDEA如何實(shí)現(xiàn)查看UML類圖

    這篇文章主要介紹了IDEA如何實(shí)現(xiàn)查看UML類圖問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • http中g(shù)et請求與post請求區(qū)別及如何選擇

    http中g(shù)et請求與post請求區(qū)別及如何選擇

    這篇文章主要介紹了http中g(shù)et請求與post請求在應(yīng)用中應(yīng)該如何選擇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • java 流與 byte[] 的互轉(zhuǎn)操作

    java 流與 byte[] 的互轉(zhuǎn)操作

    這篇文章主要介紹了java 流與 byte[] 的互轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

呈贡县| 诸暨市| 新邵县| 济阳县| 昆明市| 合山市| 普格县| 肥东县| 牡丹江市| 阳城县| 穆棱市| 望江县| 来安县| 丰镇市| 马边| 铜川市| 淮阳县| 大丰市| 兴安盟| 宁明县| 抚远县| 尖扎县| 增城市| 秦安县| 肇东市| 田东县| 宜丰县| 大埔区| 电白县| 伊吾县| 进贤县| 大埔县| 桐梓县| 陕西省| 航空| 阜阳市| 吉安市| 东海县| 东山县| 靖江市| 温泉县|