1. 程式人生 > >The valid characters are defined in RFC 7230 and RFC 3986錯誤記錄

The valid characters are defined in RFC 7230 and RFC 3986錯誤記錄

以前寫程式碼的時候遇到一個很懵逼的錯誤,如標題所說。不知道為什麼會出現這個錯誤。後來發現是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>