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
вместо.