public static void addProxy(String user, String pass, String host, String port) { if(user!= null && pass != null) { final String authUser = user; final String authPassword = pass; Authenticator.setDefault( new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( authUser, authPassword.toCharArray()); } } ); System.setProperty("http.proxyUser", authUser); System.setProperty("http.proxyPassword", authPassword); } System.setProperty("http.proxyHost", host); System.setProperty("http.proxyPort", port); }
proxy
WSO2 proxy con secuencias
Tenemos un WS que tienen tres operaciones insertar, consultar(query) y actualizar. Cuando damos de alta, no devuelve todos los datos que quisieramos. Muchos de estos datos se encuentran en la consulta. Lo que vamos a hacer, es, en un mismo proxy, realizar dos llamadas: insertar y consultar. Elmensaje de salida sera un compendio de las dos acciones.
1.- Consumidor del BUS de WSO2 realiza una llamada de inserccion.
2.- El proxy realiza la llamada de inserccion, recupera el xml resultante.
3.- El proxy recupera datos del xml resultante.
4.- El proxy crea un nuevo xml de peticion de consulta.
5.- El proxy lanza la consulta y recupera el xml de respuesta.
6.- El proxy recupera datos del xml de respuesta del apartado 5 y 3
7.- El proxy crea y envia un xml de respuesta para la llamada 1.
para todo esto necesitamos dar de alta:
– Endpoint
– Secuencias
– Proxy
Definicion del Endpoint
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="pepe.crud"> <address uri="http://host:port/pepe/crudws" format="soap11"> <suspendOnFailure> <progressionFactor>1.0</progressionFactor> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> <retryDelay>0</retryDelay> </markForSuspension> </address> </endpoint>
Definicion del proxy
<?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse" name="pepe.crud.proxy" transports="https,http" statistics="disable" trace="disable" startOnLoad="true"> <target faultSequence="fault" endpoint="pepe.crud"> <!-- definimos una secuendcia de entrada. Aqui vamos a indicar que queremos hacer --> <inSequence> <!-- Recuperamos el tipo de operacion que se esta ejecutando. Pueden ser: insertRegisty, updateRegistry, queryRegistry --> <property name="Operation" expression="get-property('Action')"/> <!-- filtramos por el resultado de la operacion. Si es igual al patron regex=".*newRegistry" --> <filter source="get-property('Operation')" regex=".*newRegistry"> <then> <!-- incvocamos la secuencia añadir --> <sequence key="crud.addRegistry.sequence"/> </then> <else> <!-- Sino es la operacion de añadir, continuamos por aqui --> <send> <!-- enviamos al WebService la peticion--> <endpoint key="wspepe.crud"/> </send> </else> </filter> </inSequence> <!-- Tratamos la respuesta del servidor --> <outSequence> <filter source="get-property('Operation')" regex=".*newRegistry"> <then> <!-- Si era una operacion de insercion en registro. Realizamos la siguiente secuencia de operaciones. --> <sequence key="crud.outRegistry.sequence"/> </then> <else> <!-- Sino, logeamos --> <log level="full"> <property name="Operation" expression="get-property('Operation')"/> </log> </else> </filter> <!-- enviamos el mensaje a nuestro consumidor --> <send buildmessage="true"/> </outSequence> </target> <publishWSDL key="conf:/WSDL/crud.crudws/crudWS.wsdl"> <resource location="typeapplicant.xsd" key="conf:/WSDL/crud.crudws/typeapplicant.xsd"/> <resource location="typeattachment.xsd" key="conf:/WSDL/crud.crudws/typeattachment.xsd"/> <resource location="typecommon.xsd" key="conf:/WSDL/crud.crudws/typecommon.xsd"/> <resource location="typecrud.xsd" key="conf:/WSDL/crud.crudws/typecrud.xsd"/> </publishWSDL> <description/> </proxy>
Definicion de las secuencias
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.addRegistry.sequence"> <!-- logeamos --> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia ADD"/> </log> <!-- invocamos a otro endpoint --> <send receive="crud.queryRegistry.sequence" buildmessage="true"> <endpoint key="pepe.crudws"/> </send> </sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.outRegistry.sequence"> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia OUT"/> <property xmlns:ns="http://org.apache.synapse/xsd" name="RegistryCode" expression="get-property('RegistryCode')"/> <property xmlns:ns="http://org.apache.synapse/xsd" name="IdRegistry" expression="get-property('IdRegistry')"/> </log> </sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.queryRegistry.sequence"> <!-- Obtenemos los datos del alta del nuevo registro para poder realizar la consulta --> <property name="IdRegistry" expression="$body/ns6:RIResponse/body/idcrud" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" /> <property name="RegistryCode" expression="$body/ns6:RIResponse/body/crudcode" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" /> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia QUERY 1"/> <property name="RegistryCode" expression="get-property('RegistryCode')" xmlns:ns="http://org.apache.synapse/xsd" /> <property name="IdRegistry" expression="get-property('IdRegistry')" xmlns:ns="http://org.apache.synapse/xsd" /> </log> <!-- creamos un xml a medida para enviar al endpoint --> <payloadFactory media-type="xml"> <format> <reg:RQRequest xmlns:reg="http://ws.pepe.com/crudws" xmlns:reg1="http://ws.pepe.com/types/crud"> <header xmlns="" version="0"/> <body xmlns=""> <crudcode>$1</crudcode> <input>1</input> </body> </reg:RQRequest> </format> <args> <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('RegistryCode')" evaluator="xml"/> </args> </payloadFactory> <!-- enviamos el xml creado al endpoint --> <header name="Action" value="http://ws.pepe.com/crudws/queryRegistry"/> <send> <endpoint key="pepe.crudws"/> </send> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia QUERY 2"/> </log> </sequence>
Este codigo ha sido elaborado por Rafael Udaondo. Con su permiso he publicado esta entrada.
Java Proxy
Sacado de esta pagina.
Para salir a internet mediante un proxy con Java tienes las siguientes opciones:
HTTP
En la llamada a la JVM, al invocar la clase:
$ java -Dhttp.proxyHost=webcache.mydomain.com MiClaseConMetodoMain $ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 MiClaseConMetodoMain $ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080-Dhttp.noProxyHosts=”localhost|host.mydomain.com” MiClaseConMetodoMain
En el codigo de la clase:
System.setProperty("http.proxyHost", "webcache.mydomain.com"); System.setPropery("http.proxyPort", "8080"); // Next connection will be through proxy. URL url = new URL("http://java.sun.com/"); InputStream in = url.openStream(); // Now, let's 'unset' the proxy. System.setProperty("http.proxyHost", null); // From now on http connections will be done directly.
HTTPS
htttps.proxyHost https.proxyPort http.nonProxyHosts
FTP
ftp.proxHost ftp.proxyPort ftp.nonProxyHosts
Configurando mas de un proxy:
$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 -Dftp.proxyHost=webcache.mydomain.com -Dftp.proxyPort=8080 MiClaseConMetodoMain
SOCKS
socksProxyHost socksProxyPort (default 1080)
Si defines un proxy HTTP y uno SOCKS,
- tiene preferencia el HTTP.
- El proxy SOCKS sera ignorado, para conexiones HTTP y SOCKS
- Una conexion FTP, en esta configuracion, iria por SOCKS.
LA CLASE: java.net.Proxy
//creamos proxy HTTP SocketAddress addr = new InetSocketAddress("webcache.mydomain.com", 8080); Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // lo invocamos URL url = new URL("http://java.sun.com/"); URConnection conn = url.openConnection(proxy); // no queremos invocarlo URL url2 = new URL("http://infos.mydomain.com/"); URLConnection conn2 = url2.openConnection(Proxy.NO_PROXY); //creamos proxy SOCK SocketAddress addr = new InetSocketAddress("socks.mydomain.com", 1080); Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // lo invocamos URL url = new URL("ftp://ftp.gnu.org/README"); URLConnection conn = url.openConnection(proxy); // Invocacion especifica de proxy para una conexion Socket Socket socket = new Socket(proxy); InetSocketAddress dest = new InetSocketAddress("server.foo.com", 1234); socket.connect(dest); // no queremos invocarlo Socket socket = new Socket(Proxy.NO_PROXY); socket.connect(new InetAddress("localhost", 1234));
LA CLASE: java.net.ProxySelector
Determina para que conexiones usar un proxy u otro
public abstract class ProxySelector { public static ProxySelector getDefault(); public static void setDefault(ProxySelector ps); public abstract List<Proxy> select(URI uri); public abstract void connectFailed(URI uri, SocketAddress sa, IOException ioe); }
Java proxy connection user pass
public class Prueba{ public static void main(String[] args) { try { String ipProxy = ""; String portProxy = ""; String userProxy = ""; String passProxy = ""; System.setProperty("http.proxyHost", ipProxy); System.setProperty("http.proxyPort", portProxy); URL url = new URL("http://www.google.es"); URLConnection uc = url.openConnection (); String encoded = new String (Base64.encode(new String(userProxy + ":" + passProxy ).getBytes())); uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded); uc.connect(); InputStream is = uc.getInputStream(); System.out.println(getStringFromInputStream(is)); } catch (Exception e) { e.printStackTrace(); } } public String getStringFromInputStream(InputStream is){ // TODO return null; } }
public final static Boolean USE_PROXY = false; public final static Boolean IS_PROXY_AUTH = false; public final static String PROXY_USER = ""; public final static String PROXY_PASSWORD = ""; public final static String PROXY_SERVER =""; public final static Integer PROXY_PORT = null; private void configureConnection() { if(USE_PROXY) { System.setProperty("http.proxyHost", PROXY_SERVER); System.setProperty("http.proxyPort", Integer.toString(PROXY_PORT)); if (IS_PROXY_AUTH) { Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(PROXY_USER, PROXY_PASSWORD.toCharArray()); } }); } else { Authenticator.setDefault(null); } } }