javaee url-pattern "/" соответствует всему, в то время как это должно иметь место только для "/*", а не для "/"

  <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>

как и ожидалось, с этим ограничением страница /test1.html требует аутентификации, а страница /test2.html не нуждается в аутентификации.

  <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>

Как и ожидалось, с этим ограничением все страницы должны проходить аутентификацию, включая /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>

с этим ограничением я бы ожидал, что страница /test1.html и / нуждаются в аутентификации, но страница /test2.html не должна нуждаться в аутентификации.

Однако оказывается, что /test2.html также требует аутентификации.

Вопрос 1. Это нормально? Почему так?

Вопрос 2. Где в спецификации написано, что шаблон url "/" эквивалентен "/*"? Спецификация Java-сервлета 2.5: http://goo.gl/UxoPL

Вопрос 3. Как я могу сказать, что корневая страница "/" требует аутентификации, а не другие страницы?

PS: я использую jboss-eap-4.3.

1 ответ

/ является специальным шаблоном URL, который соответствует всему, что не соответствует ни одному из более конкретных шаблонов URL сервлета в том же веб-приложении, как /app/*, *.do и т. д. Это, скажем, "сервлет по умолчанию". Это по умолчанию обрабатывается собственным сервлетом по умолчанию для сервлетконтейнера и обычно используется для статических ресурсов, таких как простые ванильные файлы HTML/CSS/JS/image, для которых не будет вызываться ни один из собственных сервлетов веб-приложения. Tomcat, например, имеет DefaultServlet для этого.

/* является слишком общим шаблоном URL, который соответствует всему, включая запросы "сервлета по умолчанию". Этот шаблон URL обычно используется только фильтрами, а не сервлетами. В противном случае вам придется заново изобретать задание собственного сервлета по умолчанию для сервлет-контейнера, чтобы иметь дело со статическими файлами, такими как простые ванильные файлы изображений HTML / CSS / JS /.

Что касается вашего конкретного функционального требования, вам нужно указать файл приветствия для /

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

а затем поместите шаблон URL ограничения безопасности на /index.html вместо.

Другие вопросы по тегам