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

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