Pregunta

Vamos a suponer que tengo de cadena como '=&?/;#+%' para ser parte de mi URL, vamos a decir así:

example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf

donde myString es la cadena anterior.He codificado parte crítica para la URL parece

example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf

Hasta ahora tan bueno.

Cuando estoy en el servlet y he leído ninguna de request.getRequestURI(), request.getRequestURL() o request.getPathInfo(), valor devuelto es ya decodificado, así que tengo strilng como

someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf

y yo no puede diferenciar entre lo real y caracteres especiales codificados queridos.

He resuelto problema en particular, por la prohibición por encima de caracteres en total, que trabaja en esta situación, pero todavía me pregunto ¿hay alguna forma de obtener descodifica URL en el servlet de la clase.

OTRA EDICIÓN:Cuando he llegado a este último problema por la noche yo estaba demasiado cansado para aviso de lo que realmente está pasando, que es aún más extraño! He servlet asignada en, digamos /servletPath/* después de eso, puedo poner lo que yo quiera y obtener mi servlet de responder según el resto de un camino, excepto cuando no es %2F en el camino.En ese caso solicitud de no llega el servlet, y me da el error 404!Si pongo '/' en lugar de %2F funciona OK.Estoy Tomcat 6.0.14 en Java 1.6.0-04 en Linux.

¿Fue útil?

Solución

Hay una diferencia fundamental entre '% 2F' y '/', tanto para el navegador y el servidor.

La especificación HttpServletRequest dice (sin ninguna lógica, AFAICT):

  • getContextPath: no decodificado
  • getPathInfo: decodificado
  • getPathTranslated: no decodificado
  • getQueryString: no decodificado
  • getRequestURI: no decodificado
  • getServletPath: decodificado

El resultado de getPathInfo () debe ser decodificada, pero el resultado de getRequestURI () no debe ser decodificada. Si es así, su contenedor de servlets está rompiendo la especificación (como Wouter Coekaerts y grava Francois señalado correctamente). ¿Qué versión de Tomcat se ejecuta?

Hacer las cosas aún más confusas, las versiones actuales de Tomcat rechazan rutas que contienen codificaciones de ciertos caracteres especiales, por razones de seguridad .

Otros consejos

Si hay un %2F en el decodificada url, significa que la codificado url %252F contenida.

Desde %2F se / ¿Por qué no dividir en "\/" y no preocuparse por la codificación URL?

De acuerdo con la Javadoc , getRequestURI no deben decodificar la cadena. Por otro lado, getServletPath devuelva una cadena decodificada. Probé esto utilizando localmente embarcadero y se comporta como se describe en los doc.

Así que puede haber algo más en juego en su situación ya que el comportamiento que describes no coincide con la documentación del Sol.

Parece que usted está tratando de hacer algo resty (utilizar Jersey). Lata de que acaba de análisis sintáctico de las partes anterior y posterior de la URL para obtener los datos que está buscando?

url.substring (startLength, url.length - endLength);

Actualización: esta respuesta fue originalmente erróneamente indica que " / " y "%2F " en un camino siempre deben ser tratados de la misma.De hecho, son diferentes debido a que una ruta es una lista de /-segmentos separados.

Usted no debería tener que hacer una diferencia entre un codificados y no codificados carácter en la ruta parte de la dirección URL.No hay ningún personaje dentro de la ruta de acceso que pueden tener un significado especial en una dirección URL.E. g.'%2F' deben ser interpretadas de la misma como"/", y un navegador que obtiene acceso a una dirección URL es libre para sustituir uno por el otro como lo considere oportuno.Haciendo una diferencia entre ellos es romper el estándar de cómo las Url están codificados.

En la dirección URL completa, usted debe hacer una diferencia entre escapado y no de los caracteres de escape por diferentes razones, incluyendo:

  • A ver si la ruta de acceso de la parte de los extremos.Porque ?codificado en la ruta no debe ser visto como el final.
  • Dentro de la Cadena de consulta.Debido a que la parte del valor de un parámetro puede contener '&' o '=',...
  • Dentro de una ruta, un '/' separa dos segmentos, mientras que "%2F " puede ser contenida dentro de un segmento

Java ofertas bien con el primero de los dos casos:

  • getPathInfo() que solo devuelve la ruta de acceso de la parte, decodificado
  • getParameter(String) para acceder a partes de la parte de la consulta

No tratan tan bien con el tercer caso.Si quieres hacer una diferencia entre " / " como la separación de los dos segmentos de la ruta, y un '/' dentro de un segmento de trazado (%2F), entonces sistemáticamente no se puede representar de la ruta como una cadena decodificada.Puede representar como una cadena codificada (por ejemplo, "foo/bar%2Fbaz"), o como una lista de decodificado segmentos (por ejemplo, "foo", "bar/baz").Pero porque getPathInfo() de la API de promesas para hacer eso (una cadena decodificada), no tiene ninguna opción pero para tratar de " / " y "%2F " como el mismo.

Para los habituales de las aplicaciones web, esto está bien.Si usted está en el raro caso de que usted realmente necesita para hacer la diferencia, usted puede hacer su propio análisis de la URL, obtener la versión raw con getRequestURI().Si que da la URL decodificado como usted dice, entonces eso significa que hay un error en el servlet de la aplicación que estés usando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top