javaee url-pattern "/" coincide con todo, mientras que este debería ser el caso solo para "/*", no para "/"

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Common pages</web-resource-name>
      <url-pattern>/test1.html</url-pattern>
      <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>MY_GROUP</role-name>
    </auth-constraint>
  </security-constraint>

como se esperaba, con esta restricción, la página /test1.html necesita autenticación y la página /test2.html no necesita autenticación.

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Common pages</web-resource-name>
      <url-pattern>/*</url-pattern>
      <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>MY_GROUP</role-name>
    </auth-constraint>
  </security-constraint>

como era de esperar, con esta restricción, todas las páginas necesitan autenticación, incluido /test2.html.

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Common pages</web-resource-name>
      <url-pattern>/</url-pattern>
      <url-pattern>/test1.html</url-pattern>
      <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>MY_GROUP</role-name>
    </auth-constraint>
  </security-constraint>

con esta restricción, esperaría que la página /test1.html y / necesitaran autenticación, pero la página /test2.html no debería necesitar autenticación.

Sin embargo, resulta que /test2.html también requiere autenticación.

Pregunta 1. ¿Es eso normal? ¿Por qué es así?

Pregunta 2. ¿Dónde está escrito en la especificación que el patrón de URL "/" es equivalente a "/*"? Especificación de Java Servlet 2.5: http://goo.gl/UxoPL

Pregunta 3. ¿Cómo puedo saber que la página raíz "/" requiere autenticación, pero no las otras páginas?

pd: estoy usando jboss-eap-4.3.

preguntado el 03 de mayo de 12 a las 17:05

1 Respuestas

La / es un patrón de URL especial que coincide con todo lo que es no emparejado por cualquiera de los patrones de URL de servlet más específicos en la misma aplicación web como /app/*, *.do, etc. Es, digamos, el "servlet predeterminado". De forma predeterminada, esto lo maneja el propio servlet predeterminado del servletcontainer y generalmente se usa para recursos estáticos como HTML/CSS/JS/archivos de imagen sencillos para los que no se invocaría ninguno de los servlets propios de la aplicación web. Tomcat, por ejemplo, tiene el DefaultServlet para este propósito.

La /* es un patrón de URL demasiado genérico que coincide todo, incluidas las solicitudes de "servlet predeterminado". Este patrón de URL normalmente solo lo utilizan los filtros, no los servlets. De lo contrario, tendría que reinventar el trabajo del propio servlet predeterminado de servletcontainer para manejar archivos estáticos como archivos HTML/CSS/JS/image simples.

En cuanto a su requisito funcional concreto, debe especificar un archivo de bienvenida para /

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

y luego coloque el patrón de URL de restricción de seguridad en /index.html preferiblemente.

contestado el 19 de mayo de 12 a las 18:05

Gracias. ¿Podría señalar dónde está escrito esto en la especificación J2EE? - david portabella

La especificación de servlet el capítulo 12.1 "Si ninguna de las tres reglas anteriores da como resultado una coincidencia de servlet, el contenedor intentará proporcionar contenido apropiado para el recurso solicitado. Si se define un servlet "predeterminado" para la aplicación, se utilizará. Muchos contenedores proporcionan un valor predeterminado implícito servlet para servir contenido". y 12.2: "Una cadena que contiene solo el carácter '/' indica el servlet "predeterminado" de la aplicación". - BalusC

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.