Servlet 3.1 特性功能
Servlet 3.1 特性完整支援 Servlet 3.1 規格。
Servlet 3.1 規格中已提供 Servlet 3.1 新功能的說明,這裡不再贅述。不過,對於 Servlet 3.1 特性,另有下列這些考量:
非同步 I/O
Servlet 3.1 特性的新特性指定,當啟動非阻斷讀取時,在剩餘的要求生命期限期間,任何資源都無法呼叫 API,而這可能造成阻斷讀取。以 POST 要求為例,在資源設定讀取接聽器之後,後續只要呼叫 getParameter() 和 getPart() API,都會導致 IllegalStateException。
當您使用非同步 Servlet 時,必須考量使用 AsyncContext.setTimeout API 來設定逾時值,否則會使用儲存器預設值(例如 30 秒)。每當使用 ServletRequest 啟動非同步時,會重設逾時值。會呼叫 StartAsync API,如果在前次啟動非同步之後的逾時期間內沒有呼叫 AsyncContext.complete API,StartAsync API 就會到期。當您使用 Servlet-3.1 特性提供的非同步 I/O 支援時,請使用 AsyncContext.setTimeout API 來設定逾時值,以容許非同步 I/O 完成。完成與否取決於其他外部因素,例如:環境或網路的速度。
升級處理
<webContainer upgradeReadTimeout="5000" />
<webContainer upgradeWriteTimeout="5000" />
在非同步 Servlet 處理要求期間,不得使用 Servlet 3.1 的升級特性來升級要求。
如果應用程式支援使用 Servlet 3.1 特性進行升級,則在升級的要求上,用戶端與管理升級的應用程式之間的連線需維持開啟。當從應用程式的處理程式或其他任何資源(例如 ReadListener 或 WriteListener)完成升級處理程序時,如果該應用程式沒有起始 WebConnection close(),TCP 連線會維持開啟,直到伺服器停止再啟動為止。
當您使用 Servlet 3.1 特性中的 UpgradeHandler 和 ReadListener 時,只有在用戶端關閉指向管理所升級應用程式之伺服器的連線時,才會呼叫 ReadListener.onAllDataRead 方法。onReadListener.onAllDataRead 的 Javadoc 指出「在已讀取現行要求的所有資料時呼叫」。就「升級」案例來說,伺服器並不知道資料結束,這是因為所升級的資料並不是使用 HTTP 要求內文資料的定界方式。除了在用戶端連線關閉時,無從判斷資料的結束。
表單型鑑別
在鑑別成功之後,會將用戶端重新導向至原始要求的資源。Servlet 3.1 規格指定:「為了改良重新導向要求 HTTP 方法的可預測性,儲存器在重新導向時,應使用 303 (SC_SEE_OTHER) 狀態碼,但是如果需要具備與 HTTP 1.0 使用者代理程式之間的交互作業能力,就應該使用 302 狀態碼」。Servlet-3.1 特性會維護與 HTTP 1.0 使用者代理程式之間的交互作業能力,因此一律使用 302 狀態碼。如需配置 Servlet 3.1 以具備安全性的相關資訊,請閱讀「針對 Servlet 3.1 配置 Liberty 設定檔」主題。
大量公佈資料
新增的 ServletRequest.getContentLengthLong() API 需要支援接收長度超過 Integer.MAX_VALUE,且無法完整容納於單位元組陣列或字串中的公佈資料。
String getParamter(String name)
String[] getParameterValues()
Map<String,String> getParameterMap()
所傳送的公佈資料有可能包含多個參數,當加以合併時,其長度超過了 Integer.MAX_VALUE。不過,每一個個別的參數名稱和參數值的長度必須小於 Integer.MAX_VALUE。
- 傳送公佈資料時,其片段的長度不得超過 Integer.MAX-VALUE。
- Web 儲存器所處理的公佈資料(例如:參數或組件)必須完整讀取之後,才能開始處理。如果是大量公佈資料,公佈資料可能需要可觀的記憶體,因為為了使 Web 儲存器處理成功,它所需的記憶體量可能是公佈資料大小的兩倍。