springboot中報錯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)、-_.~四個特殊字符以及保留字符( ! * ’ ( ) ; : @ & = + $ , / ? # [ ] ) (262+10+4+18=84)這84個字符,請求中出現(xiàn)了{(lán)}大括號或者[],所以tomcat報錯。
設(shè)置RelaxedQueryChars允許此字符(建議),設(shè)置requestTargetAllows選項(Tomcat 8.5中不推薦)。
根據(jù)Tomcat文檔,下面提供一種方法來設(shè)置松弛的QueryChars屬性*
在啟動類中添加
@Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { connector.setProperty("relaxedQueryChars", "|{}[]"); } }); return factory; }
springboot項目報錯問題
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個特殊字符以及所有保留字符(RFC3986中指定了以下字符為保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
springboot默認(rèn)集成了tomcat,tomcat然后當(dāng)你前端發(fā)送請求,請求參數(shù)中有保留的特殊字符時,就會報如下錯
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中新建一個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; ? ? } }
然后重啟項目測試,問題解決
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作
這篇文章主要介紹了idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-062020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解
這篇文章主要介紹了2020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02jsp頁面中獲取servlet請求中的參數(shù)的辦法詳解
在JAVA WEB應(yīng)用中,如何獲取servlet請求中的參數(shù),本文講解了jsp頁面中獲取servlet請求中的參數(shù)的辦法2018-03-03Java IO流之節(jié)點流與字符流的相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java節(jié)點流與字符流展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06