2011-06-22 9 views
31

मेरे पास एक ऐसा एप्लिकेशन है जिसे इंटरनेट पर किसी सिस्टम को एसओएपी क्लाइंट अनुरोध करने की आवश्यकता है, इसलिए इसे हमारे HTTP प्रॉक्सी के बावजूद जाना होगा।सिस्टम-व्यापी संपत्ति सेट किए बिना JAX-WS अनुरोध के लिए मैं HTTP प्रॉक्सी का उपयोग कैसे कर सकता हूं?

// Cowboy-style. Blow away anything any other part of the application has set. 
System.getProperties().put("proxySet", "true"); 
System.getProperties().put("https.proxyHost", HTTPS_PROXY_HOST); 
System.getProperties().put("https.proxyPort", HTTPS_PROXY_PORT); 

या डिफ़ॉल्ट ProxySelector (यह भी एक सिस्टम-वाइड सेटिंग) की स्थापना द्वारा:

// More Cowboy-style! Every thing Google has found says to do it this way!?!?! 
ProxySelector.setDefault(new MyProxySelector(HTTPS_PROXY_HOST, HTTPS_PROXY_PORT)); 

न तो की

एक ऐसी प्रणाली के गुण के रूप में पूरे सिस्टम पर मूल्य निर्धारित करके ऐसा कर सकते यह एक बुद्धिमान विकल्प है यदि अन्य उपप्रणालीओं को वेब सर्वरों को विभिन्न HTTP प्रॉक्सी या बिना किसी प्रॉक्सी के एक्सेस करना चाहते हैं। ProxySelector का उपयोग करके मुझे यह कॉन्फ़िगर करने दें कि कौन से कनेक्शन प्रॉक्सी का उपयोग करते हैं, लेकिन मुझे इसे विशाल एप्लिकेशन में हर चीज़ के लिए समझना होगा।

एक उचित एपीआई में एक विधि होगी जिसने ऑब्जेक्ट को java.net.Socket(java.net.Proxy proxy) कन्स्ट्रक्टर की तरह लिया था। इस तरह आवश्यक सेटिंग्स सिस्टम के उस हिस्से के लिए स्थानीय हैं जिन्हें उन्हें सेट करने की आवश्यकता है। क्या JAX-WS के साथ ऐसा करने का कोई तरीका है?

मैं सिस्टम-व्यापी प्रॉक्सी कॉन्फ़िगरेशन सेट नहीं करना चाहता हूं।

उत्तर

5

यदि आप जेएक्स-डब्ल्यूएस का उपयोग कर रहे हैं तो आप अंतर्निहित HttpURLConnection द्वारा उपयोग किए गए सॉकेट फैक्ट्री को सेट करने में सक्षम हो सकते हैं। मुझे अस्पष्ट संकेत दिखाई देते हैं कि यह एसएसएल के लिए संभव है (HTTPS SSLSocketFactory देखें) लेकिन मुझे यकीन नहीं है कि आप नियमित HTTP कनेक्शन के लिए ऐसा कर सकते हैं (या स्पष्ट रूप से यह कैसे काम करता है: JAXWSProperties क्लास वे संदर्भ एक गैर-मानक प्रतीत होता है जेडीके कक्षा)।

यदि आप सॉकेट फैक्ट्री सेट कर सकते हैं तो आप कस्टम सॉकेट फैक्ट्री को कॉन्फ़िगर कर सकते हैं जो आपके इच्छित विशिष्ट प्रॉक्सी का उपयोग करता है।

+1

'JAXWSProperties' मेरी JDK 1.6 में मौजूद प्रतीत नहीं होता है। – jbindel

+0

अगर मैं कुछ भी नहीं दिखाता तो मैं इसे बाद में स्वीकार करूंगा। – jbindel

+0

आपकी विधि काम करती है, और हमने इसे सफलतापूर्वक कार्यान्वित किया है, लेकिन मैंने समर्थित एपीआई और 'HttpsURLConnection.setDefaultSSLSocketFactory()' का उपयोग करके 'SSLSocketFactory' की JVM- विस्तृत सेटिंग के साथ जाने का निर्णय लिया। हम किसी भी कुंजी और कर्ट को एक डिफ़ॉल्ट कीस्टोर और ट्रस्टस्टोर के एक संस्करण में जोड़ देंगे। – jbindel

7

मैं एक कस्टम प्रॉक्सी चयनकर्ता का उपयोग करने की सलाह देते हैं। मुझे एक ही समस्या थी और यह बहुत अच्छा काम करता है और सुपर लचीला है। यह भी आसान है।

यहाँ मेरी CustomProxySelector है:

import org.hibernate.validator.util.LoggerFactory; 
import org.springframework.beans.factory.annotation.Value; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Logger; 

/** 
* So the way a ProxySelector works is that for all Connections made, 
* it delegates to a proxySelector(There is a default we're going to 
* override with this class) to know if it needs to use a proxy 
* for the connection. 
* <p>This class was specifically created with the intent to proxy connections 
* going to the allegiance soap service.</p> 
* 
* @author Nate 
*/ 
class CustomProxySelector extends ProxySelector { 

private final ProxySelector def; 

private Proxy proxy; 

private static final Logger logger = Logger.getLogger(CustomProxySelector.class.getName()); 

private List<Proxy> proxyList = new ArrayList<Proxy>(); 

/* 
* We want to hang onto the default and delegate 
* everything to it unless it's one of the url's 
* we need proxied. 
*/ 
CustomProxySelector(String proxyHost, String proxyPort) { 
    this.def = ProxySelector.getDefault(); 
    proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, (null == proxyPort) ? 80 : Integer.valueOf(proxyPort))); 
    proxyList.add(proxy); 
    ProxySelector.setDefault(this); 
} 

@Override 
public List<Proxy> select(URI uri) { 
    logger.info("Trying to reach URL : " + uri); 
    if (uri == null) { 
     throw new IllegalArgumentException("URI can't be null."); 
    } 
    if (uri.getHost().contains("allegiancetech")) { 
     logger.info("We're trying to reach allegiance so we're going to use the extProxy."); 
     return proxyList; 
    } 
    return def.select(uri); 
} 

/* 
* Method called by the handlers when it failed to connect 
* to one of the proxies returned by select(). 
*/ 
@Override 
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { 
    logger.severe("Failed to connect to a proxy when connecting to " + uri.getHost()); 
    if (uri == null || sa == null || ioe == null) { 
     throw new IllegalArgumentException("Arguments can't be null."); 
    } 
    def.connectFailed(uri, sa, ioe); 
} 

}

+2

मुझे लगता है कि यह 'MyProxySelector' के साथ मेरे दृष्टिकोण के समान है। – jbindel

संबंधित मुद्दे

 संबंधित मुद्दे