对 JAX-WS 应用程序使用 HTTP 会话管理支持

通过使用 cookie 或 URL 重写功能在 HTTP 传输层中执行 HTTP 会话管理。 通过提供多个选项来跟踪一系列请求, HTTP 会话管理使 Java™ API for XML-Based Web Services (JAX-WS) 应用程序对应用程序用户显示为动态。

准备工作

开发 JAX-WS Dynamic proxy 或 Dispatch client。 要了解有关如何开发 JAX-WS 客户机的更多信息,请阅读关于根据 Web 服务描述语言 (WSDL) 文件开发 JAX-WS 客户机或使用 JAX-WS API 开发动态客户机的内容。

有关此任务

可以使用 HTTP 会话管理来维护服务器上的用户状态信息,同时将最少的信息传递回至用户以跟踪会话。 可以使用会话 cookie 或 URL 重写功能在应用程序服务器上实现 HTTP 会话管理。

浏览器、应用程序服务器与应用程序之间的交互对用户和应用程序是透明的。 应用程序和用户通常无法识别服务器提供的会话标识。

会话 cookie

HTTP maintainSession 功能使用单个 cookie(即 JSESSIONID),此 cookie 包含会话标识。 此 cookie 用于将请求与存储在该会话的服务器上的信息相关联。 对于 JAX-WS 应用程序的后续请求,会将会话标识作为请求头的一部分来传输,这将使应用程序能够将给定会话标识的每个请求与该用户的先前请求相关联。 JAX-WS 客户机应用程序从 HTTP 响应头检索会话标识,然后通过在 HTTP 请求头中设置会话标识在后续请求中使用那些标识。

URL 重写

URL 重写功能的工作方式类似重定向 URL,这是因为它将会话标识存储在 URL 中。 会话标识作为从 web 页面提交的所有链接或表单上的参数进行编码。 此编码 URL 用于对同一服务器的后续请求。

过程

  1. 配置服务器以启用会话跟踪。
    使用管理控制台对会话跟踪机制指定会话 cookie 或 URL 重写功能。 请阅读关于配置会话跟踪的内容,以了解如何使用 cookie 或 URL 重写功能来跟踪会话。
  2. 对 JAX-WS 客户机启用 HTTP 会话管理。
    在策略集绑定中,可以手动将 maintainSession 属性设置为 true
    • 使用 HTTP 传输策略集文件对客户机启用会话管理。 可以使用管理控制台来配置 HTTP 传输策略。 在“HTTP 传输设置”页上,选中启用会话复选框以启用 HTTP 会话。 请阅读关于配置 HTTP Transport 属性的内容,以了解如何设置此属性。 也可以手动将 maintainSession 属性设置为 yes 以启用 HTTP 会话管理。
    • 通过将 JAX-WS 属性 javax.xml.ws.session.maintain 设置为 true,对客户机启用会话管理。

结果

您对 JAX-WS 应用程序启用了 HTTP 会话管理。

示例

以下示例摘自 HTTP 传输策略集,演示如何配置 maintainSession 属性:
<!-- This is the PolicyType for HTTP transport -->
        <wsp:ExactlyOne>
                <wsp:All>
                        <wshttp:readTimeout>300</wshttp:readTimeout>
                        <wshttp:writeTimeout>300</wshttp:writeTimeout>
                        <wshttp:connectTimeout>180</wshttp:connectTimeout>
                        <wshttp:persistConnection>yes</wshttp:persistConnection>
                        <wshttp:messageResendOnce>no</wshttp:messageResendOnce>
                        <wshttp:chunkTransferEnc>no</wshttp:chunkTransferEnc>
                        <wshttp:acceptRedirectedURL>no</wshttp:acceptRedirectedURL>
                        <wshttp:sendExpectHeader>no</wshttp:sendExpectHeader>
                        <wshttp:maintainSession>yes</wshttp:maintainSession>
                        <wshttp:compressRequest>
                                <wshttp:compressType name="none"></wshttp:compressType>
                        </wshttp:compressRequest>
                        <wshttp:compressResponse>
                                <wshttp:compressType name="none"></wshttp:compressType>
                        </wshttp:compressResponse>
                        <wshttp:protocolVersion>HTTP/1.1</wshttp:protocolVersion>
                </wsp:All>
        </wsp:ExactlyOne>
以下代码示例演示如何通过在正确的 JAX-WS 对象上设置 javax.xml.ws.session.maintain 属性来程序化地在客户机上启用会话管理。
Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
...
...
rc.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
...
...