The valid characters are defined in RFC 7230 and RFC 3986錯誤記錄
阿新 • • 發佈:2018-11-02
以前寫程式碼的時候遇到一個很懵逼的錯誤,如標題所說。不知道為什麼會出現這個錯誤。後來發現是uri中有中文導致的。錯誤日誌:
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:868) 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)
修改辦法很簡單,只需要將1.uri中的中文字元去掉即可;2.請求從get變為post;3.降低tomcat版本。
方法一:去掉中文字元(推薦這樣使用)
我原本的請求uri是這樣的:/user/張三/info,這樣寫及其不規範,應該改為/user/info,然後將引數寫在@RequestParam("name")中。請求程式碼前後對比:
/**不規範寫法*/ @GetMapping("/user/{name}/info") public Object userInfo(@PathVariable("name")String name){ ... ... } /**正確寫法*/ @GetMapping("/user/info") public Object userInfo(@RequestParam("name")String name){ ... ... }
方法二:將請求由get變為post,自測可以消除這個問題(不建議這樣使用)
/**修改前*/
@GetMapping("/user/{name}/info")
public Object userInfo(@PathVariable("name")String name){
...
...
}
/**修改後*/
@PostMapping("/user/info")
public Object userInfo(@RequestParam("name")String name){
...
...
}
方法三:降低tomcat版本,自測也可以消除這個錯誤(不建議這樣使用)
本人使用的是springboot,只需要在maven依賴中新增以下程式碼即可:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tomcat.version>8.0.29</tomcat.version>
</properties>