Posts Tagged ‘java’

  • Como Redireccionar el Trafico HTTP a HTTPS en Tomcat

    0

    Apache Tomcat tiene la habilidad de redireccionar todo el tráfico HTTP a HTTPS lo cual hace que cualquier entrada al sitio sea segura. Pero como en el caso de Mapaprop queremos servir imágenes de las propiedades a third party feeds y sorprendentemente como en el caso de OLX no pueden manejar requests HTTPS para las imágenes.

    Editando el archivo de configuración server.xml podemos redireccionar todo el tráfico a HTTPS de la siguiente manera:

    <Connector port="8080" protocol="HTTP/1.1"
    redirectPort="443"/>
    
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="conf/keystore" keystorePass="somepass"/>

    Ahora para evitar de manera permanente el protocolo HTTPS podemos editar el archivo web.xml de cada webapp que queremos servir y agregar el siguiente security constraint:

    <!-- Require HTTPS for everything except /img (favicon) and /css. -->
    <security-constraint>
    <web-resource-collection>
    <web-resource-name>Private</web-resource-name>
    <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    </security-constraint>
    <security-constraint>
    <web-resource-collection>
    <web-resource-name>PrivateORPublic</web-resource-name>
    <url-pattern>/somefolder/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
    <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
    </security-constraint>

    De ésta manera el folder /somefolder/* y todos sus descendientes pueden o no utilizar el protocolo HTTPS.

     

  • Mejoras Para Java 8

    0
    En el 2012 Oracle tiene pensado liberar Java 8 y este vendría con nuevas características.

    1. OSGi
    La modularización de java proveniente de Eclipse llegaría al JDK definitivamente

    2. Project Coin
    Mas mejoras respecto a la sintaxis del lenguage que ayudan mucho al programador. En el JDK 7 tuvimos strings en switch y otras mejoras importantes. Seria bueno poder tener cosas como

    3. Collections
    Expresiones literales para listas inmutables, mapas y sets. Asi mismo como acceso indexado para listas y mapas.

    4. Soporte para programación modular
    La idea es extender el lenguage con nuevas estructuras llamadas “superpackages” lo que permitirían una organización modular.

    5. Expresiones Lambda
    Closures para Java, la verdad son buenos shortcuts que atentan un poco contra la teoria de objetos… pero como ya todo es objeto…no estaria nada mal optimizar funciones a nivel de la vm.

    6. Annotations en cualquier lado y para cualquier cosa
    Estan proponiendo extender las annotations para que sean usadas en cualquier tipo, no solo classes metodos o declaraciones de variables.

    7. Swing application framework
    Cuantas veces tuviste que reescribir una app swing con sus bases una y otra vez ? La idea es hacer un framework el cual maneje el startup, shutdown, sessiones y manejo de recursos de manera standard y escalable.

    8. Date and Time API
    Van a reescribir Date and Time API lo cual seria excelente porque es una porqueria ahora. Especialmente la clase SimpleDateFormat que no es thread safe.

    9. Bendito DatePicker!
    Al fin piensan hacer un datepicker para Swing.

    Las mejoras que me gustarían a mi
    1. Lo que más odio del lenguaje que mas amo es el reload de la VM en cada cambio. Esto es dado a que el código es compilado y no es un scripting como php o similar. JRebel tiene un metodo de unload y reload de classes, no podria implementar eso el JDK para evitar downtime de los servidores en cada deploy ?
    2. Tipos de variables. Me acuerdo en mis dias de smalltalk donde no era requerido poner el tipo de variable. Yo la verdad que era feliz. Despues Java me obligo a poner tipos y me complico la existencia. Estoy de acuerdo de que el typing ayuda a muchisimas cosas como por ejemplo webservices, pero la verdad todo seria mas facil y corto si no fuera obligatorio el typing de las variables.
    3. Nativos para diferentes plataformas. Seria bueno que el JDK traiga un tool para poder generar un ejecutable (exe, bin o app) para cada diferente plataforma. Es algo siempre util.
  • Axis WS Client Usando AXIOM

    0

    Apache Axis2, el cual ya esta siendo dejado de lado por su complejidad y el surgimiento de otros web services stack como Metro y Apache CXF con mayor performance, brinda a los usuarios variadas opciones de data bindings.

    Este artículo muestra como llamar a un Web Service utilizando Axis Object Model. Esta técnica es de "bajo nivel", parecida a la API de JAX-WS Provider/Dispatcher. Utilizar AXIOM es mejor que trabajar con XML DOM elements pero ciertamente más complejo que hacerlo con ADB o JAXB.

    Primero los imports de las classes utilizadas

    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axiom.om.OMElement;
    import org.apache.axiom.om.OMFactory;
    import org.apache.axiom.om.OMNamespace;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.client.ServiceClient;

     

    Y ahora el código para el llamado al WS

    OMFactory factory = OMAbstractFactory.getOMFactory();
    OMNamespace omNs = fac.createOMNamespace("yournamespace", "someprefix");
    OMElement method = fac.createOMElement("theActionName", omNs);
    
    OMElement param1 = fac.createOMElement("someParam", omNs);
    param1.setText("someValue");
    method.addChild(param1);
    
    String url = "http://server/webserviceURL";
    ServiceClient client = new ServiceClient();
    Options opts = new Options();
    // es super importante, el timeout siempre lo define
    // el cliente, hay que tener en cuenta que si la operación
    // es larga es importante darle un buen timeout en ms
    opts.setTimeOutInMilliSeconds(300000);
    opts.setTo(new EndpointReference(url));
    opts.setAction("theActionName");
    client.setOptions(opts);
    OMElement res = client.sendReceive(method);
    
    // finalmente la respuesta que es nada mas
    // y nada menos que un XML
    System.out.println(res);

     

    La implementacion de AXIOM no es sencilla pero es lo más versátil en cuanto a customización de un request a un WebService.

  • Mejores Practicas Para JDBC

    0

    En el día de hoy vamos a ver algunos tips o mejroes prácticas para JDBC.

    1. Usar drivers tipo 4

    Siempre que se pueda es mejor utilizar drivers tipo 4 ya que ésta arquitectura encapsula enteramente la implementacion de la API de JDBC incluyendo la lógica de comunicación directa con la base de datos utilizando solo 1 driver. Permite que el driver sea pequeño y conciso además de ser 100% java.

    2. Utilizar un pool de conexiones

    Hoy en día cualquier aplicación seria debe utilizar un pool de conexiones a base de datos. Esta reduce el tiempo de creación y la utilización de recursos de la máquina. Apache DBCP es una utilidad muy popular para poder hacer pooling.

    3. Utilizar un pool de statements

    Si es por optimizar también podemos optimizar la creación de PreparedStatement en java alojandolos en un pool de statements el cual está diponible recien en JDBC 3.0

    4. Quitar el autocommit

    connection.setAutoCommit(false);
    

    Por default Java deja autocommit encendido, lo cual genera una transacción por cada SQL o DDL que viaja a la base de datos. En cada transacción hay una utilización de recursos del sistema en la base de datos mucho mayor a que si no la hubiese. Evaluando tu aplicación podrías hacer delay de el commit de una transacción lo más posible para optimizar recursos.

    5. Utilizar addBatch()

    La utilización de addBatch() ayuda a ejecutar varias operaciones similares reduciendo el tráfico por la red enviando solo 1 paquete en vez de tantos como inserts quieras hacer.

    6. Select Column1

    Siempre pero siempre utilizar SELECT column1, column2, etc, nunca Select * porque esto va a hacer 2 lecturas en la base de datos, 1 para ver que columnas tiene la tabla X y otro el mismo SELECT. Además tambien evitaríamos traer datos innecesarios que lo único que van a hacer es generar más tráfico de red.

  • Como Borrar Directorios En Java

    2

    Bastante simple este snippet para algo que no es nativo de Java. Java no permite borrar un directorio que contenga archivos adentro. Lo primero que hay que hacer para eliminar el directorio es simplemente eliminar los archivos interiores. Aca un snippet que se llama recursivamente.

    public boolean deleteDirectory(File directory) {
      File[] files = directory.listFiles();
        for(int i = 0; i < files.length; i++) {
          if(files[i].isDirectory()) {
    	this.deleteDirectory(files[i]);
          } else {
    	files[i].delete();
          }
       }
       return path.delete();
    }
    
    
     
    						
Page 1 of 912345»...Last »