Фильтры в Java

Фильтры в Java позволяют вмешатся в обработку запроса как до передачи запроса в jsp-страницу, так и после.

Типичное применение: фильтрация запросов на входе, аутентификация пользователя или фильтрация результатов работы страницы jsp.

Фильтры проектируются так, чтобы быть максимально независимыми от других частей приложения и от других фильтров. Т.е. следует в фильтры выносить наиболее общие функции по обработке.

Фильтры можно инициализировать в web.xml определенными параметрами при помощи  ... Совершенно аналогично сервлетам, в web.xml используется filter-mapping.

При реализации своего фильтра, надо не забыть выполнить вызвать следующий фильтр FilterChain.

chain.doFilter(reques,response);

Важно помнить, что на каждый запрос к сервлету или фильтру создается новый поток и, если в фильтрах или сервлетах используются общие ресурсы, то к ним необходимо синхронизировать доступ.

Рассмотрим две jsp-страницы index.jsp и login.jsp и пусть мы хотим перенаправить всех с index.jsp на login.jsp.

Для этого напишем фильтр под названием AuthFilter. Тело фильтра является обычным классом с реализацией init, doFilter и destroy:

package jperm;

import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse;

/** * * @author ars */ public class AuthFilter implements Filter { private FilterConfig filterConfig;

@Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; }

@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("doFilter is execute"); // Мы не можем вызвать response.sendRedirect("login.jsp") так как нам нужен httpResponse, а не ServletResponse. HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.sendRedirect("login.jsp"); //chain.doFilter(request, response); // вызываем следующий фильтр. В этом примере нам это не понадобится. }

@Override public void destroy { this.filterConfig = null; } }

В web.xml добавим название фильтра и его класс (название фильтра и имя класса могут различаться):

AuthFilterName jperm.AuthFilter  AuthFilterName /index.jsp 

Осталось создать страницы index.jsp и login.jsp, содержание которых для данного примера не имеет значения.

Литература:

LXF91:Java EE Фильтры

Фильтры в Java

Управление headres с помощью фильтров

Сервлетные фильтры