La soledad humana no es más que temor a la vida
Calavera, de Las macabras aventuras de Billy y Mandy

Archivos del día 26 de February del 2008

[Struts] - Aplicaciones modulares

El éxito de Java sobre los cientos de lenguajes de programación existentes se debe a que fue el primero en promover y apoyar dos principios básicos: modularización y reutilización. Yo creo que todos conocemos y utilizamos estos principios. 

Para aplicarlos al nivel de una aplicación web, Struts desde su versión 1.1 nos permite sudividir nuestra aplicación en subaplicaciones (módulos) para facilitar el trabajo simultáneo de diferentes equipos sobre la misma aplicación y facilitar la reutilización de módulos enteros (como un login común, administración, consulta de datos comunes…).

Para ello en la configuración del ActionServlet en el fichero web.xml introducimos algo similar a :

<!– Action Servlet Configuration –>

<servlet>

  <servlet-name>action</servlet-name>

  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

  <init-param>

    <param-name>config</param-name>

    <param-value>/WEB-INF/struts-config.xml</param-value>

  </init-param>

  <init-param>

    <param-name>config/login</param-name>

    <param-value>/WEB-INF/struts-config-login.xml</param-value>

  </init-param>

  <init-param>

    <param-name>config/consultasComunes</param-name>

    <param-value>/WEB-INF/struts-config-consultasComunes.xml</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

</servlet>

Esta declaración nos define

  • un módulo llamado login, que está definido por el fichero /WEB-INF/struts-config-login.xml; la URL necesaria para acceder vía web a este módulo será http://servidor:puerto/nombre_aplicación/login.
  • otro módulo llamado consultasComunes, definido por el fichero /WEB-INF/struts-config-consultasComunes.xml; la URL necesaria para acceder vía web a este módulo será http://servidor:puerto/nombre_aplicación/consultasComunes.
  • y un último módulo, tomado por defecto y sin nombre declarado en primer lugar y definido por el fichero /WEB-INF/struts-config.xml ;la URL necesaria para acceder vía web a este módulo será la normal, http://servidor:puerto/nombre_aplicación.

Por defecto, Struts antepone el prefijo del módulo a las URL declaradas en cada fichero de configuración de cada módulo. Es decir, si en nuestro módulo de login tenemos una acción llamada "/nuevoUsuario" que apunta a una JSP llamada "nuevoUsuario.jsp", Struts automáticamente buscará en las URLs http://servidor:puerto/nombre_aplicación/login/nuevoUsuario.do y http://servidor:puerto/nombre_aplicación/login/nuevoUsuario.jsp respectivamente.

Ocurre lo mismo para las etiquetas como html:link o html:img, por lo que

  • para enlaces entre distintos módulos en la versión 1.1 habrá que utilizar un action especial (SwitchAction); a partir de 1.2 soporta también el nombre del módulo (atributo module).
  • habrá que separar las imágenes por módulos.

A pesar de que tiene compatibilidad con Struts 1.0, 1.1, 1.2 y posteriores, por bugs en las etiquetas se recomienda utilizar módulos únicamente en las versiones 1.2 y posteriores.

Technorati Tags: , ,

 

[Struts] - Limitar el tamaño máximo de los ficheros de subida

En algunas aplicaciones permitimos la subida de archivos de los usuarios al servidor. En algunas aplicaciones existe una limitación en el tamaño de los ficheros por requisitos del sistema o de negocio. Pero siempre debería de estar limitado por razones de seguridad, para evitar que un usuario malintencionado ataque la aplicación subiendo archivos excesivamente pesados. Por defecto, el tamaño máximo está limitado a 250 Megabytes.

Existe una forma muy simple de lograrlo, y es mediante una propiedad del controlador en el struts-config.xml, maxFileSize.

 

<controller>

<set-property property="maxFileSize" value="1M" />

</controller>

o simplemente

<controller maxFileSize="1M"/>

Esta propiedad admite un valor entero seguido de "K", "M" ó "G" para referirse a kilobytes, megabytes o gigabytes. Sin ningún sufijo se interpreta como bytes. En los dos ejemplos permitimos un máximo de 1 Mega(byte).

Si un usuario intenta subir un fichero de un tamaño mayor al permitido, la propiedad FormFile del formulario (clase ActionForm) llegará a la clase Action como null, y por tanto podemos controlar este evento en nuestra clase Action para lanzar una excepción para avisar al usuario de que su fichero no ha sido subido por sobrepasar el tamaño máximo permitido.

Memoria del servidor utilizada

Por defecto, la memoria que dedicará el servidor a la subida del fichero será 500 Kilobytes. En caso de superar este valor se utilizará otro soporte externo, típicamente el sistema físico de ficheros. Podemos modificar este valor de forma análoga, utilizando la propiedad memFileSize.

<controller maxFileSize="1M" memFileSize="300K"/>

Technorati Tags: , , ,

[Struts] - Comunicaciones seguras: SSL

Es posible que nuestra aplicación web requiera comunicaciones seguras. Para ello se utiliza https como protocolo de transporte en lugar del conocido http; es decir se cifran las comunicaciones a nivel de la capa de transporte mediante Secure Sockets Layer (SSL).

Como es lógico, cifrar las comunicaciones requiere más recursos (tiempo de cifrar / descifrar, mensajes más pesados…), y normalmente las aplicaciones no necesitan comunicaciones seguras más que en algunas acciones. Por tanto construir toda la aplicación bajo https no es tan eficiente como delimitar zonas no seguras (transporte http) y zonas seguras (transporte htpps) dentro de la misma aplicación.

Para ello utilizaremos un plug-in de código abierto, la extensión de Struts SSL Extension (SSLEXT).

  • La distribución, sslext.jar y sslext.tld, consiste en un clase para la inicialización, SecurePlugIn, una clase para el procesado de peticiones, SecureRequestProcessor, y una clase para los mapeos de actions, SecureActionMapping.
  • Necesita Java Secure Socket Extension (JSSE) que se distribuye con el JDK 1.4 o posteriores.
  • Lógicamente es necesario que el servidor de aplicaciones que estemos utilizando tenga habilitado SSL.

Paso a Paso

Para utilizar la extensión por tanto, debemos

  • incluir sslext.jar y sslext.tld en nuestra aplicación
  • [struts-config.xml] - Personalizar los mapeos de las clases actio

<action-mappings type="org.apache.struts.config.SecureActionConfig">

  • [struts-config.xml] - Personalizar el procesador de peticiones

<controller processorClass="org.apache.struts.action.SecureRequestProcessor" />

  • [struts-config.xml] - Declarar el plug-in

<plug-in className="org.apache.struts.action.SecurePlugIn">

    <set-property property="httpPort" value="80"/>

    <set-property property="httpsPort" value="443"/>     

    <set-property property="enable" value="true"/>     

    <set-property property="addSession" value="true"/>     

</plug-in>

  • [struts-config.xml] - Marcar las acciones seguras mediante la propiedad secure a TRUE

<action path="/inicio*" type="es.mec.accionesintegradas.control.actions.InicioAction" parameter="inicio{1}" >

    <!– Obligamos a esta acción a utilizar https : segura –>

    <set-property property="secure" value="true"/>

    <forward name="success" path="/iniciaLogin{1}.mec" />

</action>

  • [struts-config.xml] - Marcamos las acciones no seguras mediante la propiedad secure a FALSE

<action path="/salir*" type="es.mec.accionesintegradas.control.actions.LogoutAction" parameter="logout{1}">

      <!– Obligamos a esta acción a utilizar http : NO segura –>

      <set-property property="secure" value="false"/>

      <forward name="success" path="/iniciaLogin{1}.mec" />

</action>

  • Si queremos especificar que una página JSP sea segura (o no segura) :

<%@ taglib uri="http://www.ebuilt.com/taglib" prefix="sslext"%>

<sslext:pageScheme secure="true"/>

Crítico : Cambio http <-> https

Realizar un cambio de http a https y viceversa implica cambiar el protocolo de transporte y el puerto de comunicación (8080 a 8443 ó 443). Puede influir en los CortaFuegos de los sistemas de comunicaciones de la empresa (hay que habilitar esos puertos también!). Internamente es importante saber que internamente este cambio de protocolo implica realizar un redirect.

Finalmente cambiar de una comunicación segura a no segura puede exponer datos críticos seguros a un usuario malicioso que suplante la personalidad del usuario legítimo. Normalmente una vez que se establece una conexión segura no se debe voler a una no segura.

Más información

Technorati Tags: , , , ,