Надання декількох шаблонів URL-адрес у фільтр сервлетів


76

Я використовую сервлетний фільтр у своїй програмі 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 папок.

Як вирішити цю проблему?

Відповіді:


134

Якщо шаблон 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>

4
Наскільки я бачу, декілька елементів шаблону url заборонені і працюють не так, як очікувалося.
Sebastian vom Meer

15
@SebastianG: Ваша конкретна проблема спричинена деінде. Зверніть увагу, що підтримка декількох <url-pattern>елементів була представлена ​​в Servlet 2.5 (частина Java EE 5, випущена майже 7 років тому). Можливо, ви працюєте над доісторичним звіром, або у вас є серйозні проблеми з конфігурацією, через які ваш контейнер працює у резервному режимі, що відповідає Servlet 2.4 або старшій, тим самим втрачаючи всі функції Servlet 2.5.
BalusC

15
Зверніть увагу, що декілька <filter-mapping>виконуватимуть один і той же фільтр двічі, якщо вони відповідають одному ресурсу, наприклад, один використовує, /*а інший використовує /foo.xhtmlяк url-pattern. Я зіткнувся з такою поведінкою на JBoss AS 7.1.
Себастьян Гофман

1
@Paranaix: Це справді визначена поведінка. Можливо, ви змішуєтесь із зіставленнями сервлетів, які дійсно виконуватимуть лише той сервлет з найкращим збігом шаблону URL-адреси.
BalusC


20

Якщо ви використовуєте метод анотації для визначення фільтра (на відміну від їх визначення в 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 {
    ...

8
Чи не краще розширити a Filterзамість того, HttpServletнавіть якщо це лише приклад?
Олександр

Фільтр може бути виконаний для різних шаблонів URL-адрес сервлета. Ви не можете замінити фільтр сервлетом.
Равіндра Гуллапаллі

Він хоче поведінку фільтра, а не сервлету. Думаю, він уже зіставив ці URL-адреси на сервлети.
Антон Антонов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.