springboot中報(bào)錯(cuò)Invalid character found in the request的解決
解決Invalid character found in the request問題
Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
原因
SpringBoot 2.0.0 以上都采用內(nèi)置tomcat8.0以上版本,而tomcat8.0以上版本遵從RFC規(guī)范添加了對Url的特殊字符的限制,url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~四個(gè)特殊字符以及保留字符( ! * ’ ( ) ; : @ & = + $ , / ? # [ ] ) (262+10+4+18=84)這84個(gè)字符,請求中出現(xiàn)了{(lán)}大括號或者[],所以tomcat報(bào)錯(cuò)。
設(shè)置RelaxedQueryChars允許此字符(建議),設(shè)置requestTargetAllows選項(xiàng)(Tomcat 8.5中不推薦)。
根據(jù)Tomcat文檔,下面提供一種方法來設(shè)置松弛的QueryChars屬性*
在啟動(dòng)類中添加
@Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { connector.setProperty("relaxedQueryChars", "|{}[]"); } }); return factory; }
springboot項(xiàng)目報(bào)錯(cuò)問題
java.lang.IllegalArgumentException:Invalid character found in the request target.
原因
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
高版本tomcat中的新特性:就是嚴(yán)格按照 RFC 3986規(guī)范進(jìn)行訪問解析,而 RFC 3986規(guī)范定義了Url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4個(gè)特殊字符以及所有保留字符(RFC3986中指定了以下字符為保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
springboot默認(rèn)集成了tomcat,tomcat然后當(dāng)你前端發(fā)送請求,請求參數(shù)中有保留的特殊字符時(shí),就會(huì)報(bào)如下錯(cuò)
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:683)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
有兩種解決方法
- 一種降低tomcat版本(不建議),這里就不寫了
- 另一種是在SpringBoot中增加tomcat配置
在config中新建一個(gè)TomcatConfig類
@Configuration public class TomcatConfig { ? ? @Bean ? ? public TomcatServletWebServerFactory webServerFactory() { ? ? ? ? TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); ? ? ? ? factory.addConnectorCustomizers((Connector connector) -> { ? ? ? ? ? ? connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}"); ? ? ? ? ? ? connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}"); ? ? ? ? }); ? ? ? ? return factory; ? ? } }
然后重啟項(xiàng)目測試,問題解決
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實(shí)現(xiàn)PDF添加水印的示例
本文主要介紹了SpringBoot實(shí)現(xiàn)PDF添加水印的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作
這篇文章主要介紹了idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java手動(dòng)創(chuàng)建線程池代碼實(shí)例
這篇文章主要介紹了Java手動(dòng)創(chuàng)建線程池代碼實(shí)例,FixedThreadPool或者SingleThreadPool,允許的請求隊(duì)列長度為Integer.MAX_VALUE,可能會(huì)堆積大量的請求,從而導(dǎo)致OOM,需要的朋友可以參考下2023-12-12spring mvc實(shí)現(xiàn)登錄賬號單瀏覽器登錄
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)登錄賬號單瀏覽器登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-042020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解
這篇文章主要介紹了2020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02jsp頁面中獲取servlet請求中的參數(shù)的辦法詳解
在JAVA WEB應(yīng)用中,如何獲取servlet請求中的參數(shù),本文講解了jsp頁面中獲取servlet請求中的參數(shù)的辦法2018-03-03Java IO流之節(jié)點(diǎn)流與字符流的相關(guān)知識(shí)總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java節(jié)點(diǎn)流與字符流展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06