如何获得真正的Webservice响应,而不是403错误?

时间:2012-12-21 10:40:46

标签: java jax-ws http-status-code-403

我在从网络服务获取真实消息时遇到了一些麻烦。

访问过去工作正常,但是当我在一段时间后再次尝试测试时,AXIS 2返回了403 HTTP错误。

org.apache.axis2.AxisFault: Transport error: 403 Error: Forbidden

我开始思考它可能是什么,所以我尝试通过SOAP UI访问它,它向我显示我的证书已过期。

这是我用SoapUI获得的消息

The page requires a valid SSL client certificate
Your client certificate has expired or is not yet valid. A Secure Sockets Layer (SSL) client certificate is used for identifying you as a valid user of the resource.

此消息还有更多内容,我只是将其缩短以使帖子尽可能小。

好的,还没有问题,我只需找到一种方法通知用户他的证书可能已过期(或任何其他错误已经发生),而不是仅向他显示403错误。

我试图用JAX-WS访问它,我得到了相同的消息,我得到的是,我试着查看异常,看看那里是否有任何隐藏信息,但没有运气。我得到的是:

com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 403: Forbidden
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.checkStatusCode(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(Unknown Source)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Unknown Source)
at com.sun.xml.internal.ws.client.Stub.process(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)

任何人都可以给我一些指示,说明我能做些什么才能获得真实信息?这是我用来访问它的代码

    public static void main(String[] args){

    try{
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

        System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

        System.clearProperty("javax.net.ssl.keyStore");
        System.clearProperty("javax.net.ssl.keyStorePassword");
        System.clearProperty("javax.net.ssl.trustStore");

        System.setProperty("javax.net.ssl.keyStore", "myCertificatePath");
        System.setProperty("javax.net.ssl.keyStorePassword", "myCertificatePassword");

        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", "cacertsFilePath");

        NfeRecepcao2 nfe = new NfeRecepcao2();

        NfeDadosMsg dados = new NfeDadosMsg();
        dados.getContent().add(getFileContent("C:\\teste.xml"));

        NfeCabecMsg cabec = new NfeCabecMsg();
        cabec.setCUF("35");
        cabec.setVersaoDados("2.00");
        Holder<NfeCabecMsg> header = new Holder<NfeCabecMsg>(cabec);
        NfeRecepcao2Soap12 proxy = nfe.getNfeRecepcao2Soap12();
        NfeRecepcaoLote2Result result = proxy.nfeRecepcaoLote2(dados, header);
        for (Object o : result.getContent()){
            System.out.println(o);
        }
    } catch (Exception e){
        e.printStackTrace();
    }

getFileContent 只打开一个文件并从其内容生成一个String。

这里有任何指示都会有很大的帮助。提前谢谢大家

1 个答案:

答案 0 :(得分:0)

查看您获得的回复的一种方法是记录客户端发送和接收的soap请求和响应。

如果你正在使用JAX-WS,那么

System.setProperty("Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", true);

如果您正在使用JAX-WS RI客户端,那么

System.setProperty("Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", true);

JAX-WS RI库作为标准包含在JDK中(这是Java 6),然后Sun必须重命名属性名称以包含&#39; internal&#39;。因此,如果您使用JDK附带的JAX-WS RI,则必须确保将内部添加到属性名称。