1. 程式人生 > >Java程式設計師注意:Tomcat Get請求的巨坑!

Java程式設計師注意:Tomcat Get請求的巨坑!

image

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種方法即可。

如果對你有用,歡迎分享到朋友圈

image

相關推薦

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 CodeJava程式設計師最容易犯的10個錯(第一部分)

翻譯:叩丁狼教育吳嘉俊 Java語言最開始是為了互動電視機而開發的,隨著時間的推移,他已經廣泛應用各種軟體開發領域。基於面向物件的設計,遮蔽了諸如C,C++等語言的一些複雜性,提供了垃圾回收機制,平臺無關的虛擬機器技術,Java創造了一種前所未有的開發方式。另一方面,得益於Java提出的“一次編

Buggy Java CodeJava程式設計師最容易犯的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年學