Что такое Filter в Java-сервлетах

Часто бывает, что нужно чтобы перед вызовом какого-либо сервлета или после вызова выполнялся какой-либо код.

Для этого нужно реализовать интерфейс Filter и реализовать его абстрактный метод doFilter, в котором и пишется код, который будет выполняться до сервлета и после него.

Example

Например:

Если нужно чтобы сначала пользователь авторизировался, и только если данные авторизации правильные запустился какой-либо сервлет.

Создадим сервлет, перед которым и после которого будет выполняться код.

Это простой сервлет, ничего нового здесь нет.

Пример программы:

import java.util.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(“/filterservlet”) public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); pw.println(“servlet”); } }

Класс реализующий Filter

Теперь создаем класс, который реализовывает Filter и в котором пишется код, который выполняется перед сервлетом и после сервлета.

Аннотацией WebFilter в urlPatterns указываем адрес сервлета, к которому будет применен данный фильтр. То есть адрес /filterservlet – сервлета выше.

urlPatterns, initParams,… можно задать и не через аннотацию, а и через web.xml, но здесь это демонстрировать не будем, также можно задать параметры инициализации в фильтре с помощью аннотации WebInitParam вместо тега <init-param> в web.xml (аннотацию WebInitParam можно использовать не только в фильтре).

Пример программы:

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebFilter(urlPatterns = “/filterservlet”, initParams=@WebInitParam(name = “Name”,value = “Value”))) public class FilterClass implements Filter { public void init(FilterConfig fConf) throws ServletException { //здесь использовать заданные параметры инициализации System.out.println(fConf.getInitParameter(“name”)); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //этот код выполнится до вызова сервлета PrintWriter pw=resp.getWriter(); pw.println(“invoked before”); //так вызывается сам сервлет по адресу //который был указан в urlPatterns chain.doFilter(req, resp); //этот код выполнится после вызова сервлета pw.println(“invoked after”); } public void destroy() {} }

Проверка работы сервлета и класса фильтра

Скомпилируем файл сервлета и файл класса реализующего Filter и в адресной строке перейдем по адресу /filterservlet.

Как видим, выполнился код в методе doFilter, который до вызова сервлета (вывелось invoked before), код самого сервлета (вывелось servlet) и вывелся код в методе doFilter, который после вызова сервлета (вывелось invoked after).

Слушатели (Listeners) в Java сервлетах

Разберитесь с Listeners в Java сервлетах: отслеживайте изменения атрибутов, сессий и контекста. Практический пример использования ServletContextAttributeListener.
Time to read: 15

Оптимизация сервлетов с AsyncContext

Используйте AsyncContext в Java сервлетах для асинхронной обработки задач. Узнайте, как избежать простоя потоков и повысить производительность веб-приложений с примерами кода.
Time to read: 11

Азы работы с Java Server Pages (JSP)

Основы JSP: создание первой JSP-страницы, преобразование JSP в сервлеты, преимущества перед чистым HTML. Практическое руководство по началу работы с Java Server Pages.
Time to read: 17