2014-09-28 108 views
1

我有一個由jetty提供的web服務。 如何過濾非法字符的URL?如何自定義響應錯誤400錯誤請求

當請求URL具有非法字符時,我無法控制某些返回信息。

實際上,我想在URL無效時返回一些特定的信息。例如: :我在我的應用程序中添加了一個過濾器來驗證URL,如果非法,那麼我將返回定義的信息。

但是,我不能過濾一些URL,如「%adsasd」,它似乎是由碼頭處理。

捲曲-v -X PUT -u用戶:密碼 'http://myip.com:8080/%adsasd'

* Trying 127.0.0.1... 
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0) 
* Server auth using Basic with user 'user' 
> PUT /%adsasd HTTP/1.1 
> Authorization: Basic YWRtaW46MTIzNDU2 
> User-Agent: curl/7.35.0 
> Accept: */* 
> Host:127.0.0.1:8080 
> < HTTP/1.1 400 Bad Request 
    < Content-Length: 0 
* Server Jetty(9.0.6.v20130930) is not blacklisted 
    < Server: Jetty(9.0.6.v20130930) < 
* Connection #0 to host 127.0.0.1 left intact 

回答

0

從碼頭錯誤響應

HTTP/1.1 400 Bad Request 

表示碼頭並檢測爲壞網址並拒絕。

至於如何定製這個,那真是棘手,主要是由於如何在它在發生此特定請求的處理早。

這種錯誤(400 Bad Request)原始的解析過程中發生傳入的http請求,在服務器容器甚至試圖找出要與之通話的上下文之前。

在特定的webapp上下文中沒有辦法定製錯誤處理程序來處理這種基本的http錯誤。由於服務器尚未弄清甚至可以與之交談的環境。

服務器端(即使在全局級別)也無法自定義此錯誤消息。

如果你想要這樣的功能,please file a feature request

+0

是的,但我可以處理不良的網址和拒絕與自定義信息?例如:返回一個json字符串,{「錯誤」:「你需要檢查你的URL」}等 – CHmoonKa 2014-09-29 06:17:40

+0

我想拒絕我的網址過濾器不是碼頭的容器。但是,現在具有被碼頭拒絕的錯誤URL的請求,沒有發送到我的應用程序。 – CHmoonKa 2014-09-29 06:50:18

+0

正如答案所指出的那樣,由於這是非常糟糕的,因此碼頭無法知道發送到哪個上下文(即web應用),它永遠不會發送到服務器上的應用程序,它太破碎了待處理。這是一個早期的協議錯誤。有效的HTTP客戶端應該基於HTTP響應代碼處理此錯誤,而不是正文內容。 – 2014-10-01 18:04:52