2017-08-30 33 views
8

का उपयोग कर अपने प्रोजेक्ट में SSL त्रुटि से अधिक Jax-WS Axis2 प्रॉक्सी मैं निम्नलिखित परियोजना संरचना है:ProxySelector

मैं एक मॉड्यूल है कि एक युद्ध फ़ाइल का निर्माण कर रहा है और एक बिलाव अनुप्रयोग सर्वर के अंदर तैनात किया जा सकता है। इस मॉड्यूल Axis2 पुस्तकालयों पर निर्भरता है:

<dependency> 
     <groupId>org.apache.axis2</groupId> 
     <artifactId>axis2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.axis2</groupId> 
     <artifactId>axis2-transport-http</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.axis2</groupId> 
     <artifactId>axis2-webapp</artifactId> 
     <type>war</type> 
    </dependency> 

और इस वर्ग के वेब INF तहत conf फ़ोल्डर में एक axis2.xml फ़ाइल है।

अब इस मॉड्यूल में एक यूनिट मॉड्यूल पर निर्भरता है, जिसमें पैकेज का प्रकार जार है।

अब मेरी वेब मॉड्यूल में, मेरे ठूंठ के लिए कोड में मैं कोड निम्नलिखित है:।

GazelleObjectValidator.getInstance() validateObject();

XcpdValidationService जार मॉड्यूल (निर्भरता) में एक कक्षा है और यह विधि SSL पर बाहरी वेब सेवा और प्रॉक्सी का उपयोग करती है।

यह वेब सेवा ग्राहक JAX WS आरआई

द्वारा उत्पन्न होता है, लेकिन इस वर्ग के माता-पिता मॉड्यूल से axis2.xml विन्यास का उपयोग नहीं करता है और यह अपने अक्ष विन्यास है, डिफ़ॉल्ट रूप से एक है, जहां मेरे प्रॉक्सी है किया जा रहा है का उपयोग करता है कॉन्फ़िगर नहीं ...

@WebEndpoint(name = "GazelleObjectValidatorPort") 
public GazelleObjectValidator getGazelleObjectValidatorPort() { 
    return super.getPort(new QName("http://ws.validator.sch.gazelle.ihe.net/", "GazelleObjectValidatorPort"), GazelleObjectValidator.class); 
} 

विधि ही इस तरह दिखता है:

@WebMethod 
@WebResult(name = "validationResult", targetNamespace = "") 
@RequestWrapper(localName = "validateObject", targetNamespace = "http://ws.validator.sch.gazelle.ihe.net/", className = "net.ihe.gazelle.schematron.ValidateObject") 
@ResponseWrapper(localName = "validateObjectResponse", targetNamespace = "http://ws.validator.sch.gazelle.ihe.net/", className = "net.ihe.gazelle.schematron.ValidateObjectResponse") 
public String validateObject(
    @WebParam(name = "base64ObjectToValidate", targetNamespace = "") 
    String base64ObjectToValidate, 
    @WebParam(name = "xmlReferencedStandard", targetNamespace = "") 
    String xmlReferencedStandard, 
    @WebParam(name = "xmlMetadata", targetNamespace = "") 
    String xmlMetadata) 
    throws SOAPException_Exception 
; 

मेरे GazelleObjectValidatorService निम्न प्लग इन द्वारा उत्पन्न होता है:

<plugin> 
    <groupId>org.apache.axis2</groupId> 
    <artifactId>axis2-aar-maven-plugin</artifactId> 
    <version>${axis2.version}</version> 
    <extensions>true</extensions> 
    <executions> 
     <execution> 
      <id>package-aar</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>aar</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <fileSets> 
      <fileSet> 
      <directory>${project.basedir}/src/main/resources/wsdl</directory> 
       <outputDirectory>META-INF</outputDirectory> 
       <includes> 
        <include>**/*.xsd</include> 
       </includes> 
      </fileSet> 
     </fileSets> 
     <servicesXmlFile>${project.build.outputDirectory}/axis2/services.xml</servicesXmlFile> 
     <wsdlFile>${project.build.outputDirectory}/wsdl/ClientConnectorService.wsdl</wsdlFile> 
    </configuration> 
</plugin> 

मैं अपने ही परिभाषित MyCommonsHttpTransportSender के साथ मेरी axis2.xml विन्यास में transportSender ओवरराइड करने की कोशिश की:

<transportSender name="http" 
       class="eu.epsos.pt.cc.MyCommonsHTTPTransportSender"> 
    <parameter name="PROTOCOL">HTTP/1.1</parameter> 
    <parameter name="Transfer-Encoding">chunked</parameter> 

और

<transportSender name="https" 
       class="eu.epsos.pt.cc.MyCommonsHTTPTransportSender"> 
    <parameter name="PROTOCOL">HTTP/1.1</parameter> 
    <parameter name="Transfer-Encoding">chunked</parameter> 
</transportSender> 

कि प्रॉक्सी के बारे में जानता है।

लेकिन दुर्भाग्य से वेब सेवा क्लाइंट जार के अंदर है जो युद्ध की निर्भरता है, लेकिन यह मेरी axis2.xml कॉन्फ़िगरेशन का उपयोग नहीं करता है, लेकिन इसकी अपनी धुरी कॉन्फ़िगरेशन का उपयोग करता है, जो इसके बारे में नहीं जानता प्रॉक्सी।

यह निम्न त्रुटि जहां स्पष्ट रूप से देखते हैं कि यह डिफ़ॉल्ट CommonsHTTPTransportSender का उपयोग करता है और इसलिए त्रुटि फेंक कारण बनता है:

Caused by: java.net.ConnectException: Connection refused (Connection refused) 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140) 
    at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:130) 
    at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) 
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
    at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621) 
    at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193) 
    at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75) 
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404) 
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231) 
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443) 
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406) 
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
    at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:578) 
    at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.doInvoke(AxisInvocationController.java:127) 
    at org.apache.axis2.jaxws.core.controller.impl.InvocationControllerImpl.invoke(InvocationControllerImpl.java:93) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:373) 
    ... 40 common frames omitted  

बच्चे जार में WS ग्राहक एक ही का इस्तेमाल करते हैं यह बताने के लिए एक रास्ता है माता-पिता मॉड्यूल के Axis2 विन्यास (है कि एक परिनियोजन योग्य युद्ध है और Axis2 निर्भरता है?)

अद्यतन:

मेरे युद्ध फ़ाइल एक Axis2 विन्यास, इस युद्ध के स्रोत कोड से, एक सेवा के साथ उत्पन्न किया है wsimport कहा जाता है जो एक जार में है जो अभिभावक युद्ध की निर्भरता है। यह सेवा बाहरी वेब सेवा को कॉल करती है और यह एक्सिस पर होती है (हालांकि axis2.xml कॉन्फ़िगरेशन फ़ाइल का उपयोग नहीं करती है, क्योंकि यह एक JAR के वेब-आईएनएफ फ़ोल्डर में है। एक्सिस के बिना जेएआर में बाहरी वेब सेवा कॉल करने और केवल जेएक्सडब्ल्यूएस का उपयोग करने की कोई संभावना नहीं होगी? यह मेरी समस्याओं का समाधान करेगा ...

+1

पर सेट करने की आवश्यकता है क्या आप अपने प्रॉक्सी चयनकर्ता का उपयोग करना चाहते हैं या आपको बस अपने स्टब के लिए प्रॉक्सी कॉन्फ़िगर करने की आवश्यकता है? – kolossus

+0

मैं सिर्फ यह जानना चाहता हूं कि मैं अपने स्टब के लिए प्रॉक्सी को कैसे कॉन्फ़िगर कर सकता हूं। यदि यह मेरे प्रॉक्सी चयनकर्ता का उपयोग करके व्यवहार्य होगा तो यह बहुत अच्छा होगा। अगर कोई और तरीका है तो यह मेरे लिए भी एक समाधान है। फिलहाल वह सॉकेट से गुजरता है और सिर्फ मेरे प्रॉक्सी चयनकर्ता को अनदेखा करता है क्योंकि एक्सिस –

+1

के अंदर HTTP क्लाइंट का उपयोग कर रहा है, मुझे लगता है कि मुझे पता चला है कि क्यों: एक्सिस जेएक्स-डब्ल्यूएस का सही कार्यान्वयन नहीं है। [मेरा पिछले जवाब के आधार पर] (https://stackoverflow.com/q/30636982/), हमें सुरक्षित सॉकेट फैक्ट्री सेट करने के लिए वहां दो दृष्टिकोणों में से एक का उपयोग करना चाहिए ('JAXWSProperties.SSL_SOCKET_FACTORY' के बजाय) मेरे जवाब में। आपको अपना उत्तर भी हटा देना चाहिए और – kolossus

उत्तर

2

एक्सिस 2 एक सुविधाजनक विधि to configure the HTTP Transport प्रदान करता है। तो, अपने नमूना कोड से निम्नलिखित:

HttpTransportProperties.ProxyProperties proxyProperties = new HttpTransportProperties.new ProxyProperties(); 
proxyProperties.setProxyHostName("hostName"); 
proxyProperties.setProxyPort("hostPort"); 
proxyProperties.setUsername("User"); 
proxyProperties.setPassword("pw"); 
//set the properties 
objectValidatorService.getServiceClient().getOptions().setProperty(HttpConstants.PROXY, proxyProperties); 

ऊपर क्योंकि आप शेयर JAX-WS कार्यान्वयन the Axis2-specific client उपयोग कर रहे हैं, नहीं आपके लिए काम नहीं करेगा। आपके स्टैकट्रैक के आधार पर, ऐसा लगता है कि आप एक टीएलएस-सुरक्षित एंडपॉइंट से कनेक्ट हो रहे हैं। There's a solution for that

मैंने बहुत सारे शोध किए हैं, और स्टॉक JAX-WS का उपयोग कर अंतर्निहित HTTPUrlConnection पर कोई पहुंच नहीं है। हमारे पास क्या है, set a custom SSLContextFactory का एक तरीका है।

public class CustomSocketFactory extends SSLProtocolSocketFactory { 

    private static final CustomSocketFactory factory = new CustomSocketFactory(); 

    static CustomSocketFactory getSocketFactory(){ 
     return factory; 
    }  

    public CustomSocketFactory() { 
     super(); 
    } 

    @Override 
    public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) { 
     Socket socket = null; 
     try { 
      int proxyPort = 1000; 
      InetSocketAddress proxyAddr = new InetSocketAddress("proxyAddr", proxyPort); 
      Socket proxyConn = new Socket(new Proxy(Proxy.Type.SOCKS, proxyAddr)); 
      proxyConn.connect(new InetSocketAddress("endHost", 443)); 
      socket = (SSLSocket) super.createSocket(proxyConn, "proxyEndpoint", proxyPort, true); 

     } catch (IOException ex) { 

     Logger.getLogger(CustomSocketFactory.class.getName()).log(Level.SEVERE, null, ex); 
    } 
     return socket; 
    } 
} 

अब हम अपाचे के साथ इस कस्टम सॉकेट कारखाने httpclient क्रम रजिस्टर करेंगे (एक्सिस नहीं करता शेयर जावा HTTPUrlConnection उपयोग करते हैं, के रूप में अपने स्टैकट्रेस इसका सबूत है: तो हम एक कस्टम कारखाने, that will connect to the proxy first बना कर शुरूआत):

Protocol.registerProtocol("https",new Protocol("https", new CustomSocketFactory(), 443)); 

यह केवल टीएलएस कनेक्शन के लिए काम करता है। (हालांकि, एक कस्टम सॉकेट फैक्ट्री गैर-https अंतराल पर भी लागू होती है)। आपको टाइमआउट को 0 so we can guarantee that your overriden createSocket gets invoked

+0

आपके उत्तर के लिए धन्यवाद। लेकिन दुर्भाग्य से मेरे पास मेरे GazelleObjectValidatorService पर getServiceClient() विधि नहीं है। My GazelleObjectValidatorService जेएक्स-डब्लूएस आरआई द्वारा उत्पन्न एक वर्ग है 2.2.8 –

+0

सार्वजनिक वर्ग GazelleObjectValidatorService सेवा (javax.xml.ws.Service) –

+0

बढ़ाता है I GazelleObjectValidator –