与https Web服务通信时接收HTTP 302错误代码 [英] Receiving HTTP 302 error code when communicating with https web service

查看:317
本文介绍了与https Web服务通信时接收HTTP 302错误代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Apache Tomcat中托管了一个java Web服务。 Tomcat Server.xml文件有这样的条目:

I have a java web service hosted in Apache Tomcat. Tomcat Server.xml file have an entry like this:

Connector port="8025" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"

但是,端口8443(假设是ssl端口)是注释掉。

But, the port 8443 (suppose to be ssl port) is commented out.

使用HTTPWatch,我注意到服务器正在将客户端请求重定向到 http://sa-dev-sf.erp.net/testWSthree/service?wsdl 。而不是https:// ..并且在httpwatch中有以下标题信息:(状态 - 行)HTTP / 1.1 302找到;连接关闭位置sa-dev-sf.erp.net/testWSthree/service?wsdl

Using HTTPWatch, I noticed that server is redirecting the client request to http://sa-dev-sf.erp.net/testWSthree/service?wsdl. instead of https://.. and has following Header info in httpwatch: (Status-Line) HTTP/1.1 302 Found; Connection close Location sa-dev-sf.erp.net/testWSthree/service?wsdl

这是我的客户端测试类。如果我在tomcat服务器中部署客户端并调用该服务,我将收到错误(请参阅下面的日志)。请注意,使用Eclipse IDE从本地计算机上运行正常

Here is my client test class. If I deploy the client in tomcat server and call the service I am getting error (See log below). Please note this is working fine from my local machine using Eclipse IDE

import a.Service;  //from wsimport
import a.ServiceImplService; //from wsimport

public class Call {
public String callTest(){  
    ServiceImplService serviceImpl = new ServiceImplService();
    Service s = serviceImpl.getServiceImplPort();
    final BindingProvider getResultBP = (BindingProvider) s ;
    getResultBP.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"https://sa-dev.erp.xxxx.net/testWSthree/service");
    System.out.println(s.salaryUpgrade("sanjoy"));
}}

以下是 wsimport 生成的两个类:

@WebService(name = "Service", targetNamespace = "http://a/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Service {
/**
 * @param name
 * @return returns java.lang.String
 */
@WebMethod(operationName = "SalaryUpgrade")
@WebResult(partName = "return")
@Action(input = "http://a/Service/SalaryUpgradeRequest", output = "http://a/Service/SalaryUpgradeResponse")
public String salaryUpgrade(
    @WebParam(name = "name", partName = "name")
    String name);
}

@WebServiceClient(name = "ServiceImplService", targetNamespace = "http://a/", wsdlLocation = 
"https://sa-dev.erp.xxxxx.net/testWSthree/service?wsdl")
public class ServiceImplService extends javax.xml.ws.Service
{

private final static URL SERVICEIMPLSERVICE_WSDL_LOCATION;
private final static WebServiceException SERVICEIMPLSERVICE_EXCEPTION;
private final static QName SERVICEIMPLSERVICE_QNAME = new QName("http://a/", "ServiceImplService");

static {
    URL url = null;
    WebServiceException e = null;
    try {
        url = new URL("https://sa-dev.erp.xxxxx.net/testWSthree/service?wsdl");
    } catch (MalformedURLException ex) {
        e = new WebServiceException(ex);
    }
    SERVICEIMPLSERVICE_WSDL_LOCATION = url;
    SERVICEIMPLSERVICE_EXCEPTION = e;
}

public ServiceImplService() {
    super(__getWsdlLocation(), SERVICEIMPLSERVICE_QNAME);
}

public ServiceImplService(WebServiceFeature... features) {
    super(__getWsdlLocation(), SERVICEIMPLSERVICE_QNAME, features);
}

public ServiceImplService(URL wsdlLocation) {
    super(wsdlLocation, SERVICEIMPLSERVICE_QNAME);
}

public ServiceImplService(URL wsdlLocation, WebServiceFeature... features) {
    super(wsdlLocation, SERVICEIMPLSERVICE_QNAME, features);
}

public ServiceImplService(URL wsdlLocation, QName serviceName) {
    super(wsdlLocation, serviceName);
}

public ServiceImplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
    super(wsdlLocation, serviceName, features);
}

/**
 * 
 * @return
 *     returns Service
 */
@WebEndpoint(name = "ServiceImplPort")
public a.Service getServiceImplPort() {
    return super.getPort(new QName("http://a/", "ServiceImplPort"), Service.class);
}

/**
 * 
 * @param features
 *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
 * @return
 *     returns Service
 */
@WebEndpoint(name = "ServiceImplPort")
public a.Service getServiceImplPort(WebServiceFeature... features) {
    return super.getPort(new QName("http://a/", "ServiceImplPort"), Service.class, features);
}

private static URL __getWsdlLocation() {
    if (SERVICEIMPLSERVICE_EXCEPTION!= null) {
        throw SERVICEIMPLSERVICE_EXCEPTION;
    }
    return SERVICEIMPLSERVICE_WSDL_LOCATION;
}
}

我打电话时工作正常Eclipse IDE中的Web服务。但是,如果我在我们的tomcat服务器中部署此客户端应用程序并调用该服务,则会收到以下错误:

 Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

 root cause 
 javax.xml.ws.WebServiceException: Failed to access the WSDL at: https://sa-dev.erp.xxxxx.net/testWSthree/service?wsdl. It failed with: 
Got sa-dev-sf.erp.umasscs.net while opening stream from https://sa-dev.erp.xxxxx.net  /testWSthree/service?wsdl.
com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:173)
com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:155)
com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:120)
com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:257)
com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:220)
com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:168)
com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:96)
javax.xml.ws.Service.<init>(Service.java:77)
a.ServiceImplService.<init>(ServiceImplService.java:41)
ws.callWS.Call.callTest(Call.java:26)
org.apache.jsp.index_jsp._jspService(index_jsp.java:68)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

 root cause 
 java.io.IOException: Got sa-dev-sf.erp.umasscs.net while opening stream from https://sa-    dev.erp.xxxxx.net/testWSthree/service?wsdl

 com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:842)
com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:283)

我真的很感激这方面的任何帮助。谢谢。

I really appreciate any help on this issue. Thanks you.

推荐答案

您是否在信任库中导入了ssl证书? eclipse JVM可能有证书而你的部署没有。

Did you import the ssl certificate in the trust store? It is possible that eclipse JVM have the certificate and your deployment did not.

openssl s_client -connect -showcerts< / dev / null | openssl x509 -outform PEM> cert.pem
此命令将下载证书。您可以使用任何指向您服务器网址的浏览器来执行此操作。

openssl s_client -connect -showcerts < /dev/null | openssl x509 -outform PEM > cert.pem this command would download the certificate. You can do that with any browser pointing to your web address of your server.

并列出:keytool -list -keystore -storepass

and list with : keytool -list -keystore -storepass

如果您的证书不在那里,请添加:
keytool -import -alias -file derp.pem -keystore -storepass

If your certificate is not there you add it with : keytool -import -alias -file derp.pem -keystore -storepass

这篇关于与https Web服务通信时接收HTTP 302错误代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆