我们有一个在 WebSphere Application Server(以下简称“客户端”)上运行的 Java 应用程序,它对分布在两个数据中心上的另一个应用程序进行 Web 服务调用,并在其之上有一个负载均衡器。
负载均衡器的工作方式如下:
- 您访问了负载均衡器网址
- 它为您提供带有新 URL(数据中心之一)的 HTTP 302 响应
- 客户端应用程序直接与其中一个数据中心的 Web 服务应用程序对话
例如:
> curl -i -s -k https://stealthwsort-1810.*.*/StealthWS/StealthServices
HTTP/1.0 302 Found
Location: https://stealthwsort-1810-vip.*.*:5443/StealthWS/StealthServices
Content-Type: text/html
Expires: Mon, 1 Jan 2001 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Server: BigIP
Connection: Keep-Alive
Content-Length: 0
由于某种原因,我们的客户端应用程序无法理解来自负载均衡器的 HTTP 302 响应,并在日志中抛出 WSWS3514E 和 WSWS3499W 错误:
[3/23/16 9:12:36:066 GMT] 00000029 HttpOutboundC E WSWS3514E: No HTTP response body is available from the connection for: https://stealthwsort-1810.apaas-np.*.*/StealthWS/StealthServices
[3/23/16 9:12:36:068 GMT] 00000029 SystemOut O esEligibilityWs(ERROR)=Unable to process the Stealth Status request at site : https://stealthwsort-1810.apaas-np.*.*/StealthWS/StealthServices : Error : WSWS3499W: Redirected new location: https://stealthwsort-1810.apaas-np.*.*/StealthWS/StealthServices
at bundles.workflow.classes.TaskWrapper.execute(TaskWrapper.java:581)
at bundles.workflow.classes.ProcessController.processTask(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1661)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1602)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:113)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:80)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:507)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:374)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:878)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:191)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:515)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:306)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:84)
at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1819)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture$1.run(AsyncChannelFuture.java:205)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1660)
IBM 网站建议:
You may want to check the product documentation for details about how to accept the automatic redirection to the new location.
但我找不到这方面的任何具体手册。
请指出我正确的方向。如果需要,我准备提供更多详细信息。
谢谢, 叶夫根
最佳答案
首先,您需要为 JVM 配置一些额外的 HTTP 传输属性:
打开管理控制台。
单击服务器 > 应用程序服务器 > 服务器 > Java 和进程管理 > 进程定义 > Java 虚拟机 > 自定义属性。
- 可选:如果该属性未列出,请创建一个新的属性名称。
- 输入名称和值。
可选:接受将 HTTP 请求重定向到 HTTPS 中的不同 URI。
如果在应用程序中配置了 CONFIDENTIAL 或 INTEGRAL 的传输保证,则可能会发生 HTTP 请求重定向到 HTTPS 中的不同 URI。要接受重定向,您可以执行以下任一任务:
- 设置
com.ibm.ws.webservices.HttpRedirectEnabled
Java 系统属性为 true。 - 以编程方式设置
com.ibm.wsspi.webservices.Constants.HTTP_REDIRECT_ENABLED
在调用服务之前,将属性赋给 Stub 或 Call 对象中的 java.lang.Boolean 对象。例如,使用以下任意java.lang.Boolean
将属性设置为 true 的值:- boolean 值.TRUE
- 新 boolean 值(true)
- 新 boolean 值(“true”)
- 设置
根据要求,可以在以下链接中找到产品文档: http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-base-iseries&topic=twbs_configaddhttppropertiesadmin
关于java - WSWS3499W : How to make WAS understand the HTTP 302 response from a web service?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181986/