寫了個接口,在測試訪問的時候,需要傳json串,但是后台報錯了
The valid characters are defined in RFC 7230 and RFC 3986
當前使用的tomcat版本:apache-tomcat-8.0.53
一、方案一(修改后被源碼覆蓋,無法修改文件):
在tomcat/conf/catalina.properties中添加下面這句話
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
在tomcat/conf/service.xml中在Connector標簽中添加URIEncoding="UTF-8"、relaxedQueryChars="[]|"、relaxedPathChars="[]|"
而我使用的tomcat8中catalina.properties文件中已經有了這句話,打開注釋即可。
清理tomcat后,重啟后還是無效,打開catalina.properties和service.xml查看,修改的內容自動恢復以前的狀態,重試多次也如此,修改過用戶操作文件權限也還是這種情況,真的很納悶!!!
二、方案二(修改后重啟tomcat無效)
在tomcat的vm中添加:-Dcatalina.config="J:\DevelopTool\apache-tomcat\apache-tomcat-8.0.53\backup\catalina.properties"
看網上的Tomcat源碼分析-CatalinaProperties類
這個類很簡單,就是一個屬性獲取的公共類。但是用法卻很巧妙,代碼相當優雅,所以忍不住想要再說說這個類。
它的功能是管理catalina.properties類文件中的配置屬性獲取,只有一個方法getPropertity(String name).
我認為這個類的高明之處就是充分使用了配置屬性,配置文件路徑可配置,即流程圖的第一個操作,是從環境變量中獲取的配置文件路徑。如果我通過VM參數配置-Dcatalina.config=”xxx/myfile/catalina.properties”的話,就改變了它的默認的配置文件。
方案二內容引用來源:https://blog.csdn.net/wojiushiwo945you/article/details/72865427
Tomcat源碼分析-CatalinaProperties類
引用來源:https://blog.csdn.net/guo20082200/article/details/80558151
分析原因:
第一種方案還不確定行不行,第二種方案試驗不行。經過第二種方案的閱讀發現,第一種方案沒有成功的原因是tomcat會生成catalina.properties
文件覆蓋你自己修改后的catalina.properties文件,於是我先用tomcat的clean將項目編譯成class文件,然后修改catalina.properties后
直接啟動服務,然后訪問接口成功了。
第二波bug的出現
由於參數中json串過大(20kb左右),請求接口的時候又報出了錯誤
http post request header is too large
在tomcat/conf/service.xml中在Connector標簽中添加maxHttpHeaderSize ="102400"和maxPostSize="-1",如下
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8"
relaxedQueryChars="[]|"
relaxedPathChars="[]|"
maxHttpHeaderSize ="102400"
maxPostSize="-1"/>
說明: maxPostSize="-1"(代表POST數據大小限制,在tomcat7.0.63之前,設置為0和負數均可以代表不限制;在tomcat7.0.63之后,不可以設置為0,只能是負數代表不限制),
使用postman測試接口,post請求,body下form-data和x-www-form-urlencoded均可以請求成功,如果請求參數數據量太大,不設置maxPostSize可能會報錯。
參考來源:https://blog.csdn.net/whatever8975757/article/details/60576188
第三波bug的出現
接口調試完成后,部署到測試環境時(環境中的tomcat均已修改),訪問接口又報出錯誤
Nginx 414 Request-URI Too Large
原因是請求頭的長度超出了nginx限制,在nginx.conf里面把這兩個緩存加大就行
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
打開文件
vim /usr/local/nginx/conf/nginx.conf
按i進行編輯,並添加上面兩行代碼,按Esc退出編輯,按:wq!保存
進入nginx可執行目錄sbin下
cd /usr/local/nginx/sbin/
重啟nginx
./nginx -s reload
再次訪問接口的時候就正常了。