Что такое Filter в Java сервлетах
Last updated: 10 мая 2025 г.Часто бывает, что нужно чтобы перед вызовом какого-либо сервлета или после вызова выполнялся какой-либо код.
Для этого нужно реализовать интерфейс Filter
и реализовать его абстрактный метод doFilter
, в котором и пишется код, который будет выполняться до сервлета и после него.
Например:
Если нужно чтобы сначала пользователь авторизировался, и только если данные авторизации правильные запустился какой-либо сервлет.
Создадим сервлет, перед которым и после которого будет выполняться код.
Это простой сервлет, ничего нового здесь нет.
Пример программы:
1import java.util.*;
2import java.io.IOException;
3import java.io.PrintWriter;
4
5import javax.servlet.*;
6import javax.servlet.http.*;
7import javax.servlet.annotation.*;
8
9@WebServlet("/filterservlet")
10public class MyServlet extends HttpServlet {
11 public void doGet(HttpServletRequest request,
12 HttpServletResponse response)
13 throws ServletException, IOException {
14 PrintWriter pw = response.getWriter();
15 pw.println("servlet");
16 }
17}
Класс реализующий Filter
Теперь создаем класс, который реализовывает Filter и в котором пишется код, который выполняется перед сервлетом и после сервлета.
Аннотацией WebFilter
в urlPatterns
указываем адрес сервлета, к которому будет применен данный фильтр. То есть адрес /filterservlet – сервлета выше.
urlPatterns, initParams,… можно задать и не через аннотацию, а и через web.xml, но здесь это демонстрировать не будем, также можно задать параметры инициализации в фильтре с помощью аннотации WebInitParam
вместо тега <init-param>
в web.xml (аннотацию WebInitParam можно использовать не только в фильтре).
Пример программы:
1import java.io.IOException;
2import java.io.PrintWriter;
3import javax.servlet.*;
4import javax.servlet.http.*;
5import javax.servlet.annotation.*;
6
7@WebFilter(urlPatterns = "/filterservlet",
8initParams=@WebInitParam(name = "Name",value = "Value")))
9public class FilterClass implements Filter {
10 public void init(FilterConfig fConf)
11 throws ServletException {
12 //здесь использовать заданные параметры инициализации
13 System.out.println(fConf.getInitParameter("name"));
14 }
15
16 public void doFilter(ServletRequest req,
17 ServletResponse resp, FilterChain chain)
18 throws IOException, ServletException {
19 //этот код выполнится до вызова сервлета
20 PrintWriter pw=resp.getWriter();
21 pw.println("invoked before");
22 //так вызывается сам сервлет по адресу
23 //который был указан в urlPatterns
24 chain.doFilter(req, resp);
25 //этот код выполнится после вызова сервлета
26 pw.println("invoked after");
27 }
28
29 public void destroy() {}
30}
Проверка работы сервлета и класса фильтра
Скомпилируем файл сервлета и файл класса реализующего Filter и в адресной строке перейдем по адресу /filterservlet
.

Как видим, выполнился код в методе doFilter
, который до вызова сервлета (вывелось invoked before), код самого сервлета (вывелось servlet) и вывелся код в методе doFilter
, который после вызова сервлета (вывелось invoked after).
Следующие уроки
Слушатели (Listeners) в Java сервлетах
15
мин.
Оптимизация сервлетов с AsyncContext
11
мин.
Азы работы с Java Server Pages (JSP)
17
мин.