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)文章
詳細(xì)總結(jié)各種排序算法(Java實現(xiàn))
下面小編就為大家?guī)硪黄敿?xì)總結(jié)各種排序算法(Java實現(xiàn))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
關(guān)于@MapperScan和@ComponentScan的使用問題
文章介紹了在使用`@MapperScan`和`@ComponentScan`時可能會遇到的包掃描沖突問題,并提供了解決方法,同時,還詳細(xì)解釋了`@MapperScan`和`@ComponentScan`的功能和使用場景2025-01-01
springboot整合shiro實現(xiàn)登錄驗證授權(quán)的過程解析
這篇文章主要介紹了springboot整合shiro實現(xiàn)登錄驗證授權(quán),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
spring配置文件解析失敗報”cvc-elt.1: 找不到元素 ''''beans'''' 的聲明”異常解決
這篇文章主要給大家介紹了關(guān)于spring配置文件解析失敗報”cvc-elt.1: 找不到元素 'beans' 的聲明”異常的解決方法,需要的朋友可以參考下2020-08-08
Java的設(shè)計模式編程中迪米特法則的應(yīng)用示例
這篇文章主要介紹了Java的設(shè)計模式編程中迪米特法則的應(yīng)用示例,迪米特法則中主張創(chuàng)建和使用弱耦合的類,需要的朋友可以參考下2016-02-02
SpringCloud Netflix Ribbon源碼解析(推薦)
這篇文章主要介紹了SpringCloud Netflix Ribbon源碼解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03

