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 而到期。使用 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 以获取安全性的更多信息,请阅读“配置 Liberty 概要文件以使用 Servlet 3.1”主题。
大型发布数据
添加 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 容器处理成功。