HTTP 400 錯誤 - 請求無效 (Bad request)


第一類報錯:字符串轉換錯誤和版本問題

在ajax請求后台數據時有時會報 HTTP 400 錯誤 - 請求無效 (Bad request);出現這個請求無效報錯說明請求沒有進入到后台服務里;

原因:

   1)前端提交數據的字段名稱或者是字段類型和后台的實體類不一致,導致無法封裝;

        2)前端提交的到后台的數據應該是json字符串類型,而前端沒有將對象轉化為字符串類型;

解決方案:

  1)對照字段名稱,類型保證一致性

  2)使用stringify將前端傳遞的對象轉化為字符串    data: JSON.stringify(param)  ;

具體案例:

Http Get 或 Http Post都不能傳包含 "(引號)、"{"、"}"(花括號)這樣的參數,需要對特殊字符進行轉義,把 " 轉成%22,把 { 轉成%7b,把 } 轉成%7d

   String url = "http://127.0.0.1:9000/signal/Resource?param={\"name\":\"service1\",\"param\":{\"id\":\"1\"}}";
   url = url.replace("\"", "%22").replace("{", "%7b").replace("}", "%7d"); 
注意:參數里面如果有 空格的話,也需要轉義,否則會有問題。

從本地繼續測試,跟蹤tomcat console后台,發現后台報錯:

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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:189)

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

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

    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

    at java.lang.Thread.run(Thread.java:745)

原因:tomcat 版本問題

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

Tomcat換一個低一點的版本可以!這是因為高一點的Tomcat版本對URL有更嚴格的要求,當你的URL中包含了超出RFC 7230和RFC 3968所定義的字符時,就會報錯。

本地使用的是tomcat7.0.73,正常運行的使用的是toamcat7.0.47

回測后,頁面返回正常。

原文鏈接:https://blog.csdn.net/juan0901/java/article/details/82415612

第二類報錯:請求體過大

存儲超大HTTP頭部的內存buffer大小

語法:large_client_header_buffers number size;

默認:large_client_header_buffers 48k;

配置塊:http、server

large_client_header_buffers定義了Nginx接收一個超大HTTP頭部請求的buffer個數和每個buffer的大小。如果HTTP請求行(如GET/index HTTP/1.1)的大小超過上面的單個buffer,則返回"Request URI too large"(414)。請求中一般會有許多header,每一個header的大小也不能超過單個buffer的大小,否則會返回"Bad request

(400)。當然,請求行和請求頭部的總和也不可以超過buffer個數*buffer大小。

也就是:

1.如果你的請求中的header都很大,那么應該使用client_header_buffer_size,這樣能減少一次內存分配。

2.如果你的請求中只有少量請求header很大,那么應該使用large_client_header_buffers,因為這樣就僅需在處理大header時才會分配更多的空間,從而減少無謂的內存空間浪費。

 


免責聲明!

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



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