De hecho, no es definied explícitamente en la especificación de servlets, pero al menos los formularios HTML espec definies explícitamente en la sección application/x-www-form-urlencoded:
2. Los nombres de los controles/valores se enumeran en el orden en que aparecen en el documento.
Por lo tanto, esa parte es segura.Ahora el servletcontainer, lógicamente una implementación decente y eficiente procesaría el flujo de entrada HTTP inmediatamente cuando entra, por lo que los parámetros se procesarían en el orden tal como aparecen en el URI de solicitud (GET) o cuerpo de solicitud (POST). Recopilarlos en un String[]
es la elección más sencilla, ya que también se usa tal como está en la API de Servlet, así que realmente no veo ninguna razón para recopilarlo en una estructura similar a HashSet
, o hacer un Collections#shuffle()
o lo que sea y luego convertirlo a String[]
después.
Al menos puedo decir por experiencia, Tomcat lo hace de la manera correcta, por lo que todos los principales contenedores/servidores de aplicaciones que se construyen sobre Tomcat/Catalina (IBM Websphere, JBoss AS, Sun Glassfish, etc.) también se comportarán . No tengo experiencia práctica con Weblogic, pero me sorprendería si lo procesa de manera diferente (léase: de manera menos eficiente).
Solo el pedido del parámetro nombres no está garantizado, lógicamente porque está respaldado por un HashMap
.
Resumido: los parámetros se recogen en un HashMap<String, String[]>
. Los nombres están codificados como no ordenados debido a la naturaleza del HashMap
. Los valores (un nombre de parámetro puede tener varios valores, por ejemplo, foo=bar1&foo=bar2&foo=bar3
) están a su vez ordenados debido a la naturaleza de String[]
, aunque esto no se especifica explícitamente en la API del servlet.
Para mayor seguridad, le gustaría usar un enfoque diferente, p.
foos=3&foo[0]=bar1&foo[1]=bar2&foo[2]=bar3
con
int foos = Integer.valueOf(request.getParameter("foos"));
for (int i = 0; i < foos; i++) {
int foo = Integer.valueOf(request.getParameter("foo[" + i + "]"));
}
Como HttpServletRequest es una interfaz, depende de su implementación. Aunque me sorprendería si hay una implementación que no devuelve los valores en el orden recibido. – Fortega
La documentación de la interfaz * puede * dictar el comportamiento si el diseñador así lo elige, pero en este caso no lo han hecho. – skaffman