Использование фильтра сервлета на всех страницах, кроме индекса

Я пытаюсь использовать Filter, чтобы заставить моих пользователей войти в систему, если они хотят получить доступ к некоторым страницам.

Поэтому мой Filter должен перенаправить их на страницу с ошибкой, если сеанса нет.

Но я не хочу, чтобы это происходило, когда они посещают index.html, потому что они могут войти на индексную страницу.

Поэтому мне нужен шаблон URL, который соответствует всем страницам, кроме / и index.xhtml.

Как я могу это сделать? Могу ли я использовать регулярное выражение в моем web.xml ?

РЕДАКТИРОВАТЬ:

Прочитав это

Я думал, что могу сделать что-то вроде:

if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\\.(png|gif|jpg|css|js(\\.xhtml)?))"))

в моем методе doFilter(), но он все еще обрабатывает все.

Я уверен, что регулярное выражение работает, потому что я тестировал его в Интернете, и оно соответствует файлам, которые не нужно фильтровать, но содержимое if выполняется даже для исключенных файлов!

РЕДАКТИРОВАТЬ 2:

Я пробую новый способ.

Я сопоставил фильтр с *.xhtml в моем web.xml, поэтому мне не нужно исключать css, изображения и javascript с помощью регулярного выражения выше.

Вот новый код (в doFilter())

if (req.getRequestURI().contains("index")) {
    chain.doFilter(request, response);
} else {
    if (!userManager.isLogged()) {
        request.getRequestDispatcher("error.xhtml").forward(request, response);
    } else {
        chain.doFilter(request, response);
    }
}

но это все еще не так, потому что он вызывает chain.doFilter() (во внешнем if) на каждой странице.

Как я могу исключить мою индексную страницу из фильтрации?


person StepTNT    schedule 22.05.2012    source источник


Ответы (1)


Шаблон URL-адреса web.xml не поддерживает регулярное выражение. Он поддерживает только сопоставление префикса (папки) и суффикса (расширения) с подстановочными знаками, например /faces/* и *.xhtml.

Что касается вашей конкретной проблемы, вы, по-видимому, определили индексный файл как <welcome-file> и открываете его /. Таким образом, request.getRequestURI() будет равно /contextpath/, а не /contextpath/index.xhtml. Отладьте request.getRequestURI(), чтобы узнать, что на самом деле извлек фильтр.

Предлагаю переписать:

String path = request.getRequestURI().substring(request.getContextPath().length());

if (userManager.isLogged() || path.equals("/") || path.equals("/index.xhtml") || path.startsWith(ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/WEB-INF/error.xhtml").forward(request, response);
}

Сопоставьте этот фильтр с /*. Обратите внимание, что я включил проверку ResourceHandler.RESOURCE_IDENTIFIER так что ресурсы JSF, такие как <h:outputStylesheet>, <h:outputScript> и <h:graphicImage>, также будут пропущены, иначе вы получите индексную страницу без CSS/JS/изображений, когда пользователь не вошел в систему.

Обратите внимание, что я предполагаю, что FacesServlet отображается на шаблон URL *.xhtml. В противном случае вам необходимо соответствующим образом изменить проверку /index.xhtml на path.

person BalusC    schedule 22.05.2012
comment
Вы правы, моя индексная страница настроена как файл приветствия, но request.getRequestURI() печатает /contextpath/index.xhtml, поэтому мне это кажется странным. Я попробую ваше решение как можно скорее, спасибо! - person StepTNT; 23.05.2012