传输头属性最佳实践
您可以在 Java™ API for XML-based RPC (JAX-RPC) 客户机存根、Call 实例或 Java API for XML-Based Web services (JAX-WS) BindingProvider 的 RequestContext 实例上设置 REQUEST_TRANSPORT_PROPERTIES 属性和 RESPONSE_TRANSPORT_PROPERTIES 属性,以使 Web Service 客户机可以发送或检索传输头。

REQUEST_TRANSPORT_PROPERTIES 最佳实践
- 在头值中嵌入的每个 name=value 对必须用分号 (;) 分隔。
- 每个 name 和它的值必须用等号 (=) 分隔。
name1=value1;name2=value2;name3=value3
- 传出请求头包含 name 值。
在这种情况下,将不提示并静默忽略 Map 中的 name=value,以防止客户机覆盖或修改传出请求头中已由服务器或 Web Service 引擎设置的 name 值。
- 用户的头值包含多个 name 值。
用户的头值包含多个 name 值时,将使用第一个出现的 name 值并静默忽略其他值。例如,如果用户的头值包含 name1=value1;name2=value2;name1=value3,其中 name1 出现了两次,那么将使用第一个值 name1=value1。不提示而静默忽略另一个值 name1=value3。
RESPONSE_TRANSPORT_PROPERTIES 最佳实践
仅使用 Map 键;忽略 Map 值。通过检索传输头,在此 Map 中填入值,这些值对应于传入响应消息中的 Map 键。空 Map 将导致从传入响应消息中检索所有传输头及关联值。
处理时需要特别考虑的 HTTP 头
以下是在发送和获取 HTTP 响应和请求时要特别考虑的 HTTP 头。
这些头中的值可用多种方法设置。例如,有些头值是基于部署描述符或绑定文件中的设置发送的。在这些情况中,通过 REQUEST_TRANSPORT_PROPERTIES 设置的值会覆盖任何其他方式设置的值。
头 | 发送请求 | 检索响应 |
---|---|---|
Transfer-encoding |
|
没有特殊处理。 |
Connection |
|
没有特殊处理。 |
Expect |
|
没有特殊处理。 |
主机 | 已忽略 | 没有特殊处理。 |
Content-type | 已忽略 | 没有特殊处理。 |
SOAPAction | 已忽略 | 没有特殊处理。 |
Content-length | 已忽略 | 没有特殊处理。 |
Cookie 以下是字符串常量:com.ibm.websphere.webservices.Constants.HTTP_HEADER_COOKIE |
如果该值构造正确,那么它在头上被发送。请参阅本信息以了解头值格式和 Map 值。 | 没有特殊处理。 |
Cookie2 以下是字符串常量:com.ibm.websphere.webservices.Constants.HTTP_HEADER_COOKIE2 |
请参阅“Cookie”条目中的信息。 | 没有特殊处理。 |
Set-cookie 以下是字符串常量:com.ibm.websphere.webservices.Constants.HTTP_HEADER_SET_COOKIE |
没有特殊处理。 | 如果属性 MAINTAIN_SESSION 设为 true,那么值将完整地保存在 SessionContext.CONTEXT_PROPERTY 中,并将在后续请求的 Cookie 头中发送。请参阅本表中的 Cookie 条目以了解更多信息。 |
Set-cookie2 以下是字符串常量:com.ibm.websphere.webservices.Constants.HTTP_HEADER_SET_COOKIE2 |
没有特殊处理。 | 如果属性 MAINTAIN_SESSION 设为 true,那么值将完整地保存在 SessionContext.CONTEXT_PROPERTY 中,并将在后续请求的 Cookie 头中发送。请参阅本表中的 Cookie 条目以了解更多信息。 |
样本客户机代码
public class MyApplicationClass {
// Inject an instance of the service's port-type.
@WebServiceRef(EchoService.class)
private EchoPortType port;
// This method will invoke the web service operation and send and receive transport headers.
public void invokeService() {
// Set up the Map that will contain the request headers.
Map<String, Object>requestHeaders = new HashMap<String, Object>();
requestHeaders.put(“Cookie”, “ClientAuthenticationToken=FFEEBBCC”);
requestHeaders.put(“MyHeaderFlag”, new Boolean(true));
// Set the Map as a property on the RequestContext.
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES, requestHeaders);
// Set up the Map to retrieve transport headers from the response message.
Map<String, Object>responseHeaders = new HashMap<String, Object>();
responseHeaders.put(“Set-Cookie”, null);
responseHeaders.put(“MyHeaderFlag, null);
// Invoke the web services operation.
String result = port.echoString(“Hello, world!”);
// Retrieve the headers from the response.
String cookieValue = responseHeaders.get(“Set-Cookie”);
String headerFlag = responseHeaders.get(“MyHeaderFlag”);
}
}