解決springboot項目請求出現非法字符問題 java.lang.IllegalArgumentException:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986


springboot版本: 2.1.5

最近使用springboot搭建了一個App后台服務的項目,開發接口的時候在本機使用postman工具做請求測試,請求返回一直很正常,但是在前端開發使用h5請求后台服務的時候,前台請求400,瀏覽器提示請求跨域

但是我在提供接口請求的入口處做了跨域處理的,如圖:

所以我考慮可能不是跨域問題,查看ide控制台發現每次請求都會報如下錯誤:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

org.apache.coyote.http11.AbstractHttp11Processor process

信息: Error parsing HTTP request header

 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)

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)

這段報錯的意思是:請求中含有無效字符,有效的字符在RFC 7230和RFC 3986中定義

出現這個錯誤的原因是:我們在前后台交互的時候往往使用json格式的字段串參數,其中含有“{}”“[]”這些特舒符號,在高版本的tomcat中含有這些字符的請求會被攔截

查看springboot項目的tomcat版本:

方法一:使用idea作為開發工具的可以直接點擊項目下面External Libraries,搜索字符串“tomcat”

 

可以看到tomcat版本為9.0.19

方法二:打開本地maven倉庫springboot父依賴配置,路徑如:C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-dependencies

我是2.1.5版本的springboot,打開2.1.5.RELEASE文件夾查看 spring-boot-dependencies-2.1.5.RELEASE.pom 里面的配置 搜索tomcat.version,顯示<tomcat.version>9.0.19</tomcat.version>

這就是springboot所依賴的tomcat的版本

解決辦法:

1.降低tomcat版本(不推薦),將tomcat版本改到tomcat8.5以下,但是我並不推薦這種辦法,因為你以后的開發遲早要使用更新的版本,所以怎么修改tomcat版本我就不介紹了

2.在springboot工程中增加一個tomcat 配置,或者將webServerFactory方法加入到springboot啟動類中,配置文件代碼如下:

/**
* @author: zw
* @create: 2019-06-27 11:19
**/
@Configuration
public class TomcatConfig {

@Bean
public TomcatServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers((Connector connector) -> {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
});
return factory;
}
}

在方法中我們加入了 \"<>[\\]^`{|}這些符號,問題就這么完美的解決了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM