Java程式設計師注意:Tomcat Get請求的巨坑!
Tomcat8.5,當Get請求中包含了未經編碼的中文字元時,會報以下錯誤,請求未到應用程式在Tomcat層就被攔截了。
Tomcat報錯:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
返回400錯誤:
Transfer-Encoding—>[chunked]\
null—>[HTTP/1.1 400 Bad Request]\
Server—>[Apache-Coyote/1.1]\
Connection—>[close]\
Date—>[Wed, 07 Feb 2018 03:19:04 GMT]
根據錯誤找到了Tomcat最新的原始碼:
org/apache/coyote/http11/LocalStrings.properties
iib.invalidRequestTarget=Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
org/apache/coyote/http11/Http11InputBuffer.java
boolean parseRequestLine(boolean keptAlive) throws IOException {
...
} else if (HttpParser.isNotRequestTarget(chr)) {
throw new IllegalArgumentException(sm.getString("iib.invalidRequestTarget"));
}
...
}
java/org/apache/tomcat/util/http/parser/HttpParser.java
public static boolean isNotRequestTarget(int c) {
// Fast for valid request target characters, slower for some incorrect
// ones
try {
return IS_NOT_REQUEST_TARGET[c];
} catch (ArrayIndexOutOfBoundsException ex) {
return true;
}
}
查原始碼發現在Tomcat7.0.73就已經添加了RFC 3986這個規範。
RFC 3986文件對Url的編解碼問題做出了詳細的建議,指出了哪些字元需要被編碼才不會引起Url語義的轉變,以及對為什麼這些字元需要編碼做出了相應的解釋。
RFC 3986文件規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元(! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
還有一些字元當直接放在Url中的時候,可能會引起解析程式的歧義,這些字元被視為不安全字元。
- 空格:Url在傳輸的過程,或者使用者在排版的過程,或者文字處理程式在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉。
- 引號以及<>:引號和尖括號通常用於在普通文字中起到分隔Url的作用
- #:通常用於表示書籤或者錨點
- %:百分號本身用作對不安全字元進行編碼時使用的特殊字元,因此本身需要編碼
- {}|\^[]`~:某一些閘道器或者傳輸代理會篡改這些字元
對於此問題,有以下幾種解決方案。
1、切換版本到7.0.73以下,這個不實際。
2、修改Tomcat原始碼,這個也不實際。
3、前端請求對URL編碼。
4、修改Get方法為Post方法。
5、因{}是不安全字元,預設被 tomcat攔截。如果需要在URL中傳輸json資料,在catalina.properties中新增支援。
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
總結
如果Get請求在合作方,而合作方不願意修改程式碼,那1、2種方法可以嘗試。如果Get請求在自己,可以嘗試3、4種方法。僅需要在URL上傳輸json資料,使用第5種方法即可。
如果對你有用,歡迎分享到朋友圈
相關推薦
Java程式設計師注意:Tomcat Get請求的巨坑!
Tomcat8.5,當Get請求中包含了未經編碼的中文字元時,會報以下錯誤,請求未到應用程式在Tomcat層就被攔截了。 Tomcat報錯: java.lang.IllegalArgumentException: Invalid character
#Java程式設計師福利:3分鐘知道Android開發所需要知道的知識基礎
今年的Google IO 大會上,Google宣佈Kotlin成為Android的官方語言,有興趣的可以去學習下,Java作為android的第一個語言,還是需要把打這部分知識打牢固的。(這部分內容只是當作自己的複習) 1、三大特性 Java做為面向物件的語言,他的三大特性:繼承、封裝、多型
Java程式設計師現狀:‘碼農’的未來在哪裡,將何去何從
我們是這樣的一群人:每天都在“努力”的工作著,每天都和計算機打交道,泡在網上,打遊戲,查資料,發微博。可是有一天,突然意識到,我們的未來在哪裡,每個月那點可憐的工資,一年加起來也買不了幾平米,找個女朋友也那麼難,即使找到了,她還總是跟你說,為什麼別人掙的都比你多,你每天不停的寫著程式碼,每天不停的掉
Java程式設計師注意——扼殺效能的 10 個常見 Hibernate 錯誤
那麼請閱讀這篇文章! 我在很多應用程式中修復過效能問題,其中大部分都是由同樣的錯誤引起的。修復之後,效能變得更溜,而且其中的大部分問題都很簡單。所以,如果你想改進應用程式,那麼可能也是小菜一碟。 這裡列出了導致Hibernate效能問題的10個最常見的錯誤,以及如何修復它們。 錯誤1:使用Eager Fet
Java程式設計師必備:異常的十個關鍵知識點
前言 總結了Java異常十個關鍵知識點,面試或者工作中都有用哦,加油。 一. 異常是什麼 異常是指阻止當前方法或作用域繼續執行的問題。比如你讀取的檔案不存在,陣列越界,進行除法時,除數為0等都會導致異常。 一個檔案找不到的異常: public class TestException { public
Java程式設計師必備:序列化全方位解析
前言 相信大家日常開發中,經常看到Java物件“implements Serializable”。那麼,它到底有什麼用呢?本文從以下幾個角度來解析序列這一塊知識點~ 什麼是Java序列化? 為什麼需要序列化? 序列化用途 Java序列化常用API 序列化的使用 序列化底層 日常開發序列化的注意點 序列化常見
2018年Java程式設計師的現狀,風光背後的危機!
2018年,Java程式設計師面臨更加激烈的競爭。 不得不承認,經歷過行業的飛速發展期,網際網路的整體發展趨於平穩。為什麼這麼說? 對於進可攻前端,後可守後端大本營的 Java 程式設計師而言,雖然供應逐年上漲,但是市場似乎對他們依然青睞有加。這些承擔著技術招聘市場中高供給高需求的 Java
1024程式設計師日:還有這種操作,舒適!
1024是什麼,老司機們應該不會陌生。 論壇上,它是隱晦的暗號;言語間,它是身份的象徵;計算機中,它是一級棒的讚譽;現在,它也是程式設計師們的節日。 程式猿,從來都是科技網際網路世界一個神奇的存在。 他們是世間少有的美男(女)子,上帝給了他們一雙彈鋼琴的手,他們卻用它來敲鍵盤。
#給java程式設計師的10條建議,吐血推薦!
1. 想清楚,再動手寫程式碼 剛入行的新手,為了展示自己的能力,拿到需求迫不及待地就開始上手寫程式碼,大忌! 如果有想學習java的程式設計師,可來我們的java學習扣qun:94311,1692免費送java的視訊教程噢!我整理了一份適合18年學習的java乾貨,送給每一位想學的小夥伴,並
面試技巧分享,Java程式設計師的的通病,錯過必定後悔!
會做不會說,是大部分程式設計師的通病,即將入行的初學者也有類似的問題。 要在面試中表現好,不僅僅是技巧問題,也有心態問題,這篇文章在這方面做了不錯的講解。值得大家花時間閱讀和學習。 在面試時,經過寒暄後,一般面試官會讓介紹專案經驗 。常見的問法是,說下你最近的(或最拿得出手的)一個專案。
8年開發java程式設計師教你:JAVA開發應該學習什麼?讓你不迷茫
java入門學習有哪些內容?很多想學習java的學生都不知道怎麼學java,特別是沒有基礎的學生,今天8年開發的老程式設計師,給大家整理了一下,java入門學習有哪些內容: 第一階段 計算機基本原理,Java語言發展簡史,Java開發環境的搭建,體驗Java程式的開發,Java語法格式
Java程式設計師剛寫完這段程式碼,就被開除了!網友:程式碼沒毛病啊
一般程式設計師寫的程式碼都是非常多的,畢竟這是一個技術活,需要多練習多實踐才能掌握。但是有一位程式設計師卻因為寫了一段程式碼就遭到領導開除! 在分享這篇文章之前呢,我先分享下我總結的一些乾貨,我自己也是一位從事了6年開發的全棧工程師,今年年初我整理了一份最適合2018年學習的java乾貨,包括基
調查:Java程式設計師最傷心,C++程式設計師最年老
說起我們對程式設計世界現有的刻板印象,你一定聽說過類似於沒有人喜歡用Java編碼或者使用C ++都是老人家,等等這樣的話。為了分析這些刻板印象背後的真相,Trestle Technology的資料工程師寫了一個工具。 不知道你有沒有聽說過微軟的Project Oxford,它的Face API可
(轉)致Java程式設計師:你離架構師還差多遠?
轉至:https://blog.csdn.net/ityouknow/article/details/82782965 幾乎每個Java程式設計師心中,都有著成為架構師的技術追求。那麼,成為Java架構師都需要掌握哪些技能呢?這裡有一份對標百度T7的Java架構師必知必會課程,《JavaEE企業級分散式高階
Buggy Java Code:Java程式設計師最容易犯的10個錯(第一部分)
翻譯:叩丁狼教育吳嘉俊 Java語言最開始是為了互動電視機而開發的,隨著時間的推移,他已經廣泛應用各種軟體開發領域。基於面向物件的設計,遮蔽了諸如C,C++等語言的一些複雜性,提供了垃圾回收機制,平臺無關的虛擬機器技術,Java創造了一種前所未有的開發方式。另一方面,得益於Java提出的“一次編
Buggy Java Code:Java程式設計師最容易犯的10個錯(2)
本文翻譯:吳嘉俊,叩丁狼高階講師。 Java語言最開始是為了互動電視機而開發的,隨著時間的推移,他已經廣泛應用各種軟體開發領域。基於面向物件的設計,遮蔽了諸如C,C++等語言的一些複雜性,提供了垃圾回收機制,平臺無關的虛擬機器技術,Java創造了一種前所未有的開發方式。另一方面,得益
#Java程式設計師一段有序集合程式碼,卻不知有啥問題:求幫忙看看
在我們剛開始學習程式設計的時候,會出現一些“細節”上的錯誤,這些錯誤可能並不是我們程式碼中有錯誤,而是對於一些概念還不清楚所導致的,然而程式設計偏偏又是一個需要嚴謹的技術活,所以這些細節上的失誤就會造成程式執行出錯! 近日就有一位Java程式設計師寫了一段有序集合程式碼,可是卻不知道出了
架構師推薦:2018 年 Java 程式設計師必讀的十本書推薦
如果你是一名 Java 程式設計師,正在考慮 2018 年讀什麼書,那麼這篇文章正適合你。本文中,我將分享 10 本有關 Java、Spring 及其他相關技術的書籍。 這裡面既有適合經驗豐富的 Java 程式設計師的書,它們介紹了架構、雲開發、微服務、Java 9、Spring 5,以及用於提高生
#月薪9K的Java程式設計師,寫的這段程式碼竟獲眾多網友讚許:演算法太精妙
作為一名網際網路專案開發者,在工作的過程中遇到Bug是很正常的事情,這是因為在開發的過程中遺漏了部分意想之外的需求,所以才會出現Bug。然而有時候一些程式碼也是類似於Bug這樣的存在,雖然看起來到處都是錯誤,可是卻能正常執行! 如果有想學習java的程式設計師,可來我們的java學習扣qun:7
#大神的分享:Java程式設計師的學習生涯中各個階段的建議
每一個新手在學習程式設計的時候,都會有一個迷茫期,不知道學這些知識能夠幹什麼,對於未來應該從事什麼樣的工作也很迷茫,所以作者特意寫了這一篇文章來給大家解釋。 如果有想學習java的程式設計師,可來我們的java學習扣qun:79979,2590免費送java的視訊教程噢!我整理了一份適合18年學