jueves, 15 de enero de 2009

Bug en Glassfish

Ayer probando unos ejemplos para un curso de preparación para SCWCD de Java EE 5 detecté un bug en Glassfish (v2 y v3). El problema consistía en una violación de las reglas especficadas en Servlet 2.5 en el apartado "SRV.8.4.2 Forwarded Request Parameters".

Cuando un componente web recibe una petición por parte de un cliente, este puede obtener información sobre la url especificada. Una URL se compone de distintas partes:

  • Context Path --> La ruta que permite al servidor decidir que aplicación web es la destinataria de la petición
  • Servlet Path --> La ruta que corresponde con el mapping (url-pattern) y selecciona el componente web que recibe la petición
  • Path Info --> La parte de la petición que no forma parte del context path ni del Servlet Path
  • Query String
Esta información es accesible con los métodos:
  • getRequestURL --> Retorna la URL entera incluyendo protocolo, servidor y puerto
  • getRequestURI --> No incluye protocolo, servidor ni puerto
  • getContextPath
  • getServletPath
  • getPathInfo
  • getQueryString
En el caso que hagamos un forward hacia otro componente web, estos métodos retornan información sobre la URL utilizada para obtener el RequestDispatcher y no sobre la petición realizada originalmente sobre el cliente. Si necesitamos datos sobre la URL original del cliente, está accesible en unos parámetros del request:

  • javax.servlet.forward.request_uri
  • javax.servlet.forward.context_path
  • javax.servlet.forward.servlet_path
  • javax.servlet.forward.path_info
  • javax.servlet.forward.query_string
En la especificación de Servlet 2.5 dice:

"Note that these attributes must always reflect the information in the original
request even under the situation that multiple forwards and subsequent includes
are called."
Y ese precisamente es el problema, al realizar un segundo forward, esos datos del request se pierden.

Escribo este post, no solo para informaros de este error, sino para transmitir mi agradecimiento a los desarrolladores de Glassfish que en 12 horas han solucionado el error.

Podeis consultar el bug publicado junto a la prueba unitaria para comprobar la existencia

No hay comentarios: