国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題

這篇具有很好參考價(jià)值的文章主要介紹了SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


title: “SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題”
createTime: 2021-11-24T10:27:57+08:00
updateTime: 2021-11-24T10:27:57+08:00
draft: false
author: “Atomicyo”
tags: [“tomcat”]
categories: [“java”]
description: “SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題”


SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題

場(chǎng)景:

公司以前的框架統(tǒng)一使用Post請(qǐng)求,傳入?yún)?shù)為一個(gè)定義的公共類,類里面有個(gè)String類型的bean字段傳入json字符串作為傳參,emmm就想給他改成restful風(fēng)格,在傳入?yún)?shù)公共類無法改變的情況下,Get請(qǐng)求會(huì)傳入特殊字符,導(dǎo)致400錯(cuò)誤。例如:

localhost:10001/verify/compreport/month?data={"compRefOwid":"1448487922485252098", "yhMonth":"2021-10"}

原因:

Tomcat的新版本中增加了一個(gè)新特性,就是嚴(yán)格按照 RFC 3986規(guī)范進(jìn)行訪問解析,而 RFC 3986規(guī)范定義了Url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4個(gè)特殊字符以及所有保留字符(RFC3986中指定了以下字符為保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

解決方案選擇:

  1. 前端請(qǐng)求時(shí)encode特殊字段(算了,不能因?yàn)樽约旱脑蚣哟笄岸斯ぷ髁?
  2. 改用post請(qǐng)求(emmm沒有辦法的辦法,看著難受就是想要改了)
  3. 改Tomcat配置文件(由于是springboot項(xiàng)目,內(nèi)嵌了tomcat,不方便修改,好吧就是我比較菜)
  4. 在后端代碼層面解決這個(gè)問題

解決方法:

其他服務(wù):由于使用的是內(nèi)嵌的tomcat,網(wǎng)上常見的
解決spring boot請(qǐng)求包含非法字符問題 The valid characters are defined in RFC 7230 and RFC 3986 錯(cuò)誤
配置TomcatServletWebServerFactory的方式使用時(shí)會(huì)導(dǎo)致兩個(gè)TomcatServletWebServerFactory使springboot項(xiàng)目報(bào)錯(cuò)Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans而無法啟動(dòng)。而使用yml配置的方式也無法生效。

server:
  tomcat:
    relaxed-query-chars:
      - "<"
      - ">"
      - "["
      - "]"
      - "{"
      - "}"

隨后參考了繼承WebServerFactoryCustomizer的方式來修改Tomcat配置

SpringBoot2.0.0新版本內(nèi)嵌Tomcat配置

import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

/**
 * Tomcat配置
 * @author Atomicyo
 * @version 1.0
createTime: 2021-11-24T10:27:57+08:00
updateTime: 2021-11-24T10:27:57+08:00
 */
@Component
public class MyTomcatWebServerCustomize implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    private int maxParameterCount = 10000;

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        PropertyMapper propertyMapper = PropertyMapper.get();
        propertyMapper.from(this::getMaxParameterCount)
                .when(v -> true)
                .to(v -> customizerProperty(factory));
    }

    /**
     * params特殊字符過濾
     * @param factory
     * @return void
     * @author Atomicyo
createTime: 2021-11-24T10:27:57+08:00
updateTime: 2021-11-24T10:27:57+08:00
     * @version 1.0
     */
    private void customizerProperty(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers(
                connector -> connector.setProperty("relaxedQueryChars", "[]{}"));
    }

    public void setMaxParameterCount(int maxParameterCount) {
        this.maxParameterCount = maxParameterCount;
    }

    public int getMaxParameterCount() {
        return maxParameterCount;
    }
}

網(wǎng)關(guān)模塊:

由于spring gateway使用的是netty作為服務(wù)。所以修改tomcat配置的方式無法生效。參考Spring Cloud Gateway 和 Webflux 請(qǐng)求參數(shù)非法字符處理

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.HttpRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
import reactor.netty.ConnectionObserver;
import reactor.netty.NettyPipeline;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * Netty編碼配置
 * @author Atomicyo
 * @version 1.0
createTime: 2021-11-24T10:27:57+08:00
updateTime: 2021-11-24T10:27:57+08:00
 */
@Component
@Slf4j
public class EncodeQueryNettyWebServerCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    /**
     * 需要encode的特殊字符
     */
    private final List<Character> charList = new ArrayList<Character>() {
        {
            this.add('{');
            this.add('}');
            this.add('[');
            this.add(']');
        }
    };

    @Override
    public void customize(NettyReactiveWebServerFactory factory) {
        factory.addServerCustomizers(httpServer ->
                httpServer.observe((conn, state) -> {
                    if (state == ConnectionObserver.State.CONNECTED) {
                        conn.channel().pipeline().addAfter(NettyPipeline.HttpCodec, "",  new QueryHandler());
                    }
                }));
    }


    class QueryHandler extends ChannelInboundHandlerAdapter {

        public QueryHandler() {
        }

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException {
            if (msg instanceof HttpRequest) {
                HttpRequest request = (HttpRequest) msg;
                String url = request.uri();
                // fix url
                log.info("url: {}", url);
                String[] split = url.split("\\?");
                StringBuilder fixUrl = new StringBuilder(split[0]);
                if (split.length > 1) {
                    fixUrl.append("?");
                    char[] chars = split[1].toCharArray();
                    for (char aChar : chars) {
                        if (charList.contains(aChar)) {
                            fixUrl.append(URLEncoder.encode(String.valueOf(aChar), "UTF-8"));
                        }else {
                            fixUrl.append(aChar);
                        }
                    }
                }
                log.info("fixUrl: {}", fixUrl);
                request.setUri(fixUrl.toString());
            }
            ctx.fireChannelRead(msg);
        }
    }
}

驗(yàn)證:

SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題,spring cloud,spring,后端,android文章來源地址http://www.zghlxwxcb.cn/news/detail-727794.html

到了這里,關(guān)于SpringCloud + SpringGateway 解決Get請(qǐng)求傳參為特殊字符導(dǎo)致400無法通過網(wǎng)關(guān)轉(zhuǎn)發(fā)的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • axios中g(shù)et、post請(qǐng)求傳參區(qū)別及使用

    axios中g(shù)et、post請(qǐng)求傳參區(qū)別及使用

    params 中的參數(shù)是通過地址欄傳參,一般用于get請(qǐng)求 data 是添加到請(qǐng)求體(body)中的, 一般用于post請(qǐng)求 get請(qǐng)求只能傳query參數(shù),query參數(shù)都是拼在請(qǐng)求地址上的 post可以傳body和query兩種形式的參數(shù) 一般情況下post請(qǐng)求方式的Parameter Type是body,在一些極少情況下,post請(qǐng)求的參數(shù)

    2024年02月14日
    瀏覽(29)
  • uniapp發(fā)起post和get請(qǐng)求——this.$http.get 和 this.$http.post傳參

    main.js按照內(nèi)容自行修改

    2024年02月15日
    瀏覽(51)
  • 學(xué)習(xí)筆記230810--vue項(xiàng)目中g(shù)et請(qǐng)求的兩種傳參方式

    學(xué)習(xí)筆記230810--vue項(xiàng)目中g(shù)et請(qǐng)求的兩種傳參方式

    問題描述 今天寫了一個(gè)對(duì)象方式傳參的get請(qǐng)求接口方法,發(fā)現(xiàn)沒有載荷,ip地址也沒有帶查詢字符串,數(shù)據(jù)也沒有響應(yīng)。 代碼展示 錯(cuò)誤分析 實(shí)際上這里的 query 是對(duì)象方式帶參跳轉(zhuǎn)的參數(shù)名,而get方法對(duì)象方式傳參的參數(shù)名是parmas 解決方法 get請(qǐng)求有兩種帶參的方式 方式1 :

    2024年02月10日
    瀏覽(27)
  • 前端傳參中帶有特殊符號(hào)導(dǎo)致后端接收時(shí)亂碼或轉(zhuǎn)碼失敗的解決方案

    前端傳參中帶有特殊符號(hào)導(dǎo)致后端接收時(shí)亂碼或轉(zhuǎn)碼失敗的解決方案

    項(xiàng)目中采用富文本編輯器后傳參引起的bug,起因如下: 數(shù)據(jù)庫中存入的數(shù)據(jù)會(huì)變成這種未經(jīng)轉(zhuǎn)碼的URL編碼 使用JSON方式傳參,但富文本編輯器不支持將內(nèi)容轉(zhuǎn)成JSON,會(huì)遺失標(biāo)簽,顯然不符合把富文本文章存入數(shù)據(jù)庫的需求,所以PASS 使用URL拼接方式傳參,而缺點(diǎn)也是明顯的,

    2024年01月25日
    瀏覽(32)
  • SpringGateway網(wǎng)關(guān)(Spring Gateway是Spring自己編寫的,也是SpringCloud中的組件)

    SpringGateway網(wǎng)關(guān)(Spring Gateway是Spring自己編寫的,也是SpringCloud中的組件)

    目錄 SpringGateway網(wǎng)關(guān) 奈非框架簡(jiǎn)介 什么是網(wǎng)關(guān) 網(wǎng)關(guān)的主要功能有 Spring Gateway簡(jiǎn)介 網(wǎng)關(guān)路由配置 動(dòng)態(tài)路由 早期(2020年前)奈非提供的微服務(wù)組件和框架受到了很多開發(fā)者的歡迎 這些框架和SpringCloud Alibaba的對(duì)應(yīng)關(guān)系我們要了解 現(xiàn)在還有很多舊項(xiàng)目維護(hù)是使用奈非框架完成的微

    2024年02月09日
    瀏覽(24)
  • 前端提交post請(qǐng)求卻變成get請(qǐng)求的原因及解決方法

    前端提交post請(qǐng)求卻變成get請(qǐng)求的原因及解決方法

    導(dǎo)語:筆者在vue2項(xiàng)目中,使用axios封裝post請(qǐng)求,提交請(qǐng)求時(shí)卻變成get請(qǐng)求 編寫登錄方法時(shí),把method敲成methods,而且又看到了提示就直接使用了(太粗心??) [ Axios 中文文檔 ] 改成如下代碼即可 · 瀏覽器的默認(rèn)請(qǐng)求模式是GET ? ? 當(dāng)我們?cè)跒g覽器地址欄中輸入一個(gè)網(wǎng)址或單擊鏈

    2024年02月06日
    瀏覽(26)
  • 【查錯(cuò)解決過程】Postman測(cè)試接口GET請(qǐng)求404(使用IDEA解決)

    【查錯(cuò)解決過程】Postman測(cè)試接口GET請(qǐng)求404(使用IDEA解決)

    現(xiàn)在在使用postman進(jìn)行代碼測(cè)試的時(shí)候一直報(bào)404, 不知道問題到底出在哪里。 基本的GET請(qǐng)求都不能成功... ? 然后我就發(fā)現(xiàn)可能是我沒有加上@MapperScan的聲明。 后來發(fā)現(xiàn)不是,至今也不知道eclipse怎么調(diào)。 ————————————————————————————————

    2024年02月03日
    瀏覽(29)
  • 不支持請(qǐng)求方法POST或GET的一種解決方法

    不支持請(qǐng)求方法POST或GET的一種解決方法

    Request method ‘POST‘ not supported(已解決) 該錯(cuò)誤一般是請(qǐng)求類型對(duì)不上導(dǎo)致的,比如PostMapping和GetMapping請(qǐng)求,一般錯(cuò)誤發(fā)生在下圖所示位置,我把Post和Get搞錯(cuò)了。 值得說的一點(diǎn)是,因?yàn)槲也淮_定是不是這里錯(cuò)了,所以一開始我并沒有把GetMapping注釋掉,我認(rèn)為在下面加上PostMa

    2024年02月12日
    瀏覽(23)
  • URL傳參時(shí),參數(shù)包含有特殊字符(%、#、&)的處理方法

    URL傳參時(shí),參數(shù)包含有特殊字符(%、#、&)的處理方法

    uniapp項(xiàng)目中頁面跳轉(zhuǎn)時(shí),通過url傳參,參數(shù)為一個(gè)包含特殊的字符的對(duì)象并內(nèi)容比較多,導(dǎo)致不能正常傳參 1、有些符號(hào)在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號(hào),那么就要使用他們的編碼了。編碼的格式為:%+字符的ASCII碼,即一個(gè)百分號(hào)%,后面跟對(duì)應(yīng)字符

    2024年02月11日
    瀏覽(23)
  • 原生js XMLHttpRequest發(fā)送 get post 請(qǐng)求 解決跨域 及 注意事項(xiàng)

    2、使用xhr發(fā)起GET請(qǐng)求 四個(gè)步驟: ①:創(chuàng)建 xhr對(duì)象 ②:調(diào)用 xhr的open()函數(shù)(open中傳遞兩個(gè)參數(shù),參數(shù)一是GET/POST請(qǐng)求方式,參數(shù)二是請(qǐng)求的URL地址) ③:調(diào)用 xhr.send()函數(shù) ④:監(jiān)聽 xhr.onreadystatechange事件 xhr發(fā)起GET請(qǐng)求的完整代碼 直接上示例 報(bào)錯(cuò)內(nèi)容是這個(gè) Failed to execute

    2024年02月16日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包