簡體   English   中英

如何從HttpServlet關閉HTTP連接

[英]How to close a HTTP connection from the HttpServlet

我在Tomcat 6.0.26中運行servlet。 servlet通過HTTP POST接受來自客戶端的文件上載。 我想停止從HttpServlet端上傳文件。 我沒有運氣,嘗試了以下方法:

  1. 關閉請求輸入流
  2. 發送錯誤代碼HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE並刷新響應
  3. 在過濾器中執行1和2

我用谷歌搜索,但沒有找到直接的答案。 請告知解決方案。

謝謝。

使用標准Servlet和Commons FileUpload API是不可能的。 基本上,為了能夠立即中止連接,您應該物理地抓住底層套接字並關閉它。 但是,此套接字由Web服務器控制。 另請參閱此相關問題: 如何在沒有響應標頭的情況下顯式終止來自服務器的http連接

然而,很少有測試證實,當Commons FileUpload的大小超過限制時,它不會將整個文件緩沖在內存中。 它將讀取輸入流,但只是忽略並丟棄讀取的字節(也是已讀取的字節)。 因此,內存效率不一定是這里的問題。

要解決實際問題,您基本上希望在客戶端而不是服務器端驗證文件大小。 這可以通過Java Applet或Flash應用程序實現。 例如,分別是JumpLoaderSWFUpload

使用標准API無法做到這一點。 如果你這樣做,你就違反了一些協議標准/ RFC。 那你為什么要那樣做?

相反,發送沒有http正文的“連接:關閉”響應(http標頭)。

這里有一些瘋狂的解決方法:您可以根據處理HTTP請求的套接字編寫(或找到某處)某些防火牆獨立應用程序,解析標頭,如果請求與您的自定義條件匹配,則防火牆將其轉發給Tomcat,否則返回HTTP錯誤響應。 或者您可以嘗試使用一些Apache規則來調整Apache < - > Tomcat。

問題或多或少是從servlet中止上傳以限制文件大小的重復

你嘗試過使用Apache Commons FileUpload嗎?

服務器對象中有一個setFileSizeMax方法,表示從請求中上載文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM