Предоставление нескольких шаблонов URL-адресов для сервлет-фильтра
Я использую Servlet Filter в своем приложении 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 папок.
Как решить эту проблему?
Ответы
Ответ 1
Если шаблон URL начинается с /
, то он относится к корню контекста. Шаблон URL /Admin/*
будет соответствовать только страницам 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>
Ответ 2
Если вы используете метод аннотации для определения сервлета (в отличие от определения в web.xml
), вы можете сделать это, просто поместив массив аннотаций сервлета в аннотацию @WebServlet
:
/**
* Servlet implementation class LoginFilter
*/
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter extends HttpServlet {
...