Servlet 3.1 功能部件的功能

产品支持 Servlet 3.1 规范。 请查看可用功能的声明和描述。

Servlet 3.1 函数的描述在 Java™ Servlet 规范 中提供,在产品文档中未进行描述。 但是, 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 完成。 完成取决于其他外部因素,例如,环境或网速。

升级处理

重要信息: 将 ServletOutput流类与 WriteListener 接口配合使用,将 ServletInput流类与 ReadListener 接口配合使用。 请勿将这些类与 ObjectInputStream 类或 ObjectOutputStream 类配合使用。 这些类会绕开 ReadListener 和 WriteListener 接口的一些必需检查(主要是 isReady 检查),并且可能会导致意外的行为。
升级处理是具有非分块读写功能的 Servlet 3.1 功能部件。 当读或写操作是异步操作时,对于服务器等待操作完成的时间没有任何限制。 可使用 server.xml 文件中的 Web 容器定制属性(例如,upgradereadtimeoutupgradewritetimeout)设置超时。 请参阅以下示例(其中超时值为 5 秒):
<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 返回以下消息:
Invoked when all data for the current request is read.
在升级情况下,服务器不知道数据结尾,因为所升级数据不是按定界 HTTP 请求主体的方式定界的。 除客户机连接关闭时以外,无法确定数据结尾。

基于表单的认证

成功认证后,客户机将重定向至原始请求的资源。 Servlet 3.1 规范指定:To improve the predictability of the HTTP method of the redirected request, containers must redirect using the 303 (SC_SEE_OTHER) status code, except where interoperability with HTTP 1.0 user agents is required; in which cases the 302 status code must be used.该功能部件保留与 HTTP 1.0 用户代码的互操作性,并始终使用 302 状态码。 有关配置Servlet 3.1 以实现安全性的更多信息,请参阅 "配置 Liberty for Servlet 3.1 " 主题。

大型发布数据

添加 ServletRequest.getContentLengthLong() API 要求支持接收长度超过 Integer.MAX_VALUE 并且无法被单字节数组或字符串完全容纳的发布数据。

当您获取使用以字符串或 byte [] 返回内容的 API 的发布数据内容时,此添加会产生影响。 例如,用于访问参数的 javax.servlet.ServletRequest 方法:
String    getParamter(String name)
String[]  getParameterValues()
Map<String,String> getParameterMap()

可能发生以下情况,您发送包含多个参数的发布数据,这些参数组合到一起时长度超过 Integer.MAX_VALUE。 但是,每个参数名和参数值的长度必须小于 Integer.MAX_VALUE

发送大量发布数据包括以下附加注意事项:
  • 必须以长度小于 Integer.MAX-VALUE 的块的形式发送发布数据。
  • 处理开始之前,必须完整读取 Web 容器处理的发布数据(例如,参数或部件)。 大型发布数据可能导致大量内存需求,因为它可能需要发布数据大小的双倍内存,以便 Web 容器处理成功。