Предоставление нескольких шаблонов URL для фильтра сервлетов
Я использую фильтр сервлетов в моем приложении JSF. У меня есть три группы веб-страниц в моем приложении, и я хочу проверить аутентификацию для этих страниц в моем фильтре сервлета:
мои папки
/Admin/ *.xhtml
/Supervisor/*.xhtml
/Employee/*.xhtml
а я пишу web.xml
как
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.ems.admin.servlet.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/Employee/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/Admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/Supervisor/*</url-pattern>
</filter-mapping>
но запросы типа
http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml
не входят в фильтр.
Я должен обеспечить безопасность этих 3 папок.
как решить эту проблему ?
2 ответа:
если шаблон URL начинается с
/
, то это относительно корневого контекста. Элемент/Admin/*
шаблон URL будет соответствовать только на страницахhttp://localhost:8080/EMS2/Admin/*
(предполагая, что/EMS2
- это путь контекста), но у вас их на самом деле наhttp://localhost:8080/EMS2/faces/Html/Admin/*
, так что ваш шаблон URL никогда не соответствует.вам нужно префикс ваших шаблонов URL с
/faces/Html
Ну вот так:<url-pattern>/faces/Html/Admin/*</url-pattern>
вы также можете просто перенастроить структуру/конфигурацию вашего веб-проекта, чтобы вы могли избавиться из
/faces/Html
путь в URL-адреса, так что вы можете просто открыть страницу, напримерhttp://localhost:8080/EMS2/Admin/Upload.xhtml
.ваш синтаксис отображения фильтра все в порядке. Однако более простой способ указать несколько URL-адресов, чтобы просто использовать только один
<filter-mapping>
с множественными<url-pattern>
запись:<filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/faces/Html/Employee/*</url-pattern> <url-pattern>/faces/Html/Admin/*</url-pattern> <url-pattern>/faces/Html/Supervisor/*</url-pattern> </filter-mapping>
в случае, если вы используете метод аннотации для определения фильтра (в отличие от определения их в
web.xml
), вы можете сделать это, просто положив массив отображений в@WebFilter
аннотация:/** * Filter implementation class LoginFilter */ @WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"}) public class LoginFilter implements Filter { ...
и так же, как FYI, это же самое работает для сервлетов, используя аннотацию сервлета тоже:
/** * Servlet implementation class LoginServlet */ @WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"}) public class LoginServlet extends HttpServlet { ...