Подтвердить что ты не робот

Предоставление нескольких шаблонов 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 папок.

Как решить эту проблему?

4b9b3361

Ответ 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 {
    ...