Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 41bfd3b

Browse files
committed
Added Filter folder in the MVCPracticeAdvanced section of a small course on Java EE
1 parent 88d84f9 commit 41bfd3b

File tree

5 files changed

+168
-0
lines changed

5 files changed

+168
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package Filter.DemoServlets;
2+
3+
import jakarta.servlet.ServletException;
4+
import jakarta.servlet.annotation.WebServlet;
5+
import jakarta.servlet.http.HttpServlet;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletResponse;
8+
9+
import java.io.IOException;
10+
11+
@WebServlet(name = "MayBeMistake",
12+
description = "This imitation of error action",
13+
urlPatterns = "/ErrorImitation")
14+
public class MayBeMistake extends HttpServlet {
15+
@Override
16+
protected void doGet(HttpServletRequest req,
17+
HttpServletResponse resp)
18+
throws ServletException, IOException {
19+
if(true){
20+
throw new RuntimeException();
21+
}
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package Filter.Filters;
2+
/*
3+
Выбираем библиотеку JAKARTA при выборе имплиментируемого интерфейса.
4+
У данного интерфейса есть классические методы сервлетов init и destroy
5+
(они дефолтные и их, естественно, можно переопределить).
6+
7+
Наш первый фильтр просто установит кодировку на странице к которой
8+
обратился пользователь (и на ответ сервера).
9+
*/
10+
import jakarta.servlet.*;
11+
import jakarta.servlet.annotation.WebFilter;
12+
13+
import java.io.IOException;
14+
import java.nio.charset.StandardCharsets;
15+
16+
/*
17+
В отличие от классического сервлета у фильтра аннотация @WebFilter,
18+
методы init и destroy, у него тоже есть. В выбранном случае, а именно
19+
"/*" наш сервлет фильтр будет срабатывать на все запросы пользователя
20+
из-за значка астериск.
21+
22+
В параметрах можно задавать несколько URL паттернов через запятую или
23+
имена сервлетов, где будет применяться данный фильтр. Если они заранее
24+
прописаны в каждом сервлете, например так:
25+
26+
@WebServlet(value = "/registration", name = "UserRegForm"))
27+
*/
28+
@WebFilter("/*")
29+
public class CharsetFilter implements Filter {
30+
@Override
31+
public void doFilter(ServletRequest servletRequest,
32+
ServletResponse servletResponse,
33+
FilterChain filterChain) throws IOException, ServletException {
34+
/* Устанавливаем кодировку на запрос и ответ */
35+
servletRequest.setCharacterEncoding(StandardCharsets.UTF_8.name());
36+
servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.name());
37+
/*
38+
Нам необходимо решить сразу вернуть ответ по запросу пользователя
39+
или передать запрос/ответ дальше по цепочке, либо другому фильтру,
40+
либо сервлету обрабатывающему запросы по заданному URL
41+
*/
42+
filterChain.doFilter(servletRequest, servletResponse);
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package Filter.Filters;
2+
3+
import jakarta.servlet.*;
4+
import jakarta.servlet.annotation.WebFilter;
5+
6+
import java.io.IOException;
7+
8+
/*
9+
Сработает на страницу имитирующую ошибку, для усиления
10+
добавив параметр dispatcherTypes, который позволяет
11+
перенаправить запрос на страницу с ошибкой. Параметры
12+
диспатчера FORWARD и INCLUDE можно применять для запуска
13+
фильтра при перенаправлении запроса между веб-сервлетами.
14+
*/
15+
@WebFilter(value = "/ErrorImitation",
16+
dispatcherTypes = DispatcherType.ERROR)
17+
public class ErrorFilter implements Filter {
18+
@Override
19+
public void doFilter(ServletRequest servletRequest,
20+
ServletResponse servletResponse,
21+
FilterChain filterChain) throws IOException, ServletException {
22+
23+
filterChain.doFilter(servletRequest, servletResponse);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package Filter.Filters;
2+
3+
import jakarta.servlet.*;
4+
import jakarta.servlet.annotation.WebFilter;
5+
6+
import java.io.IOException;
7+
import java.util.Arrays;
8+
9+
/*
10+
Аннотация фильтр с параметром, который запустит
11+
наш сервлет фильтр на любой запрос, т.е. мы
12+
'логируем' все запросы к нашему саерверу.
13+
*/
14+
@WebFilter("/*")
15+
public class LoggingFilter implements Filter {
16+
@Override
17+
public void doFilter(ServletRequest servletRequest,
18+
ServletResponse servletResponse,
19+
FilterChain filterChain) throws IOException, ServletException {
20+
/*
21+
Получаем карту параметров (Ключ, Значение) и отображаем их в консоли.
22+
Значение ключей (параметров) в свою очередь тоже списки
23+
*/
24+
servletRequest.getParameterMap().
25+
forEach((Key, Val) -> System.out.println(Key + ":" + Arrays.toString(Val)));
26+
27+
filterChain.doFilter(servletRequest, servletResponse);
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package Filter.Filters;
2+
/*
3+
Хитрость фильтров в том, что ответ фильтром может быть
4+
возвращен пользователю сразу после обработки запроса и
5+
даже не обращаться к целевому сервлету и таких фильтров
6+
может быть целый каскад (см. ServletFilter.jpg).
7+
*/
8+
import AirportSimulatorTwo.DTO.UserDto;
9+
import jakarta.servlet.*;
10+
import jakarta.servlet.annotation.WebFilter;
11+
import jakarta.servlet.http.HttpServletRequest;
12+
import jakarta.servlet.http.HttpServletResponse;
13+
14+
import java.io.IOException;
15+
16+
@WebFilter("/unsafe")
17+
public class UnSafeFilter implements Filter {
18+
@Override
19+
public void doFilter(ServletRequest servletRequest,
20+
ServletResponse servletResponse,
21+
FilterChain filterChain) throws IOException, ServletException {
22+
/*
23+
Постоянное приведение типов необходимо для получения
24+
доступа к требуемым методам. В данном случае получаем
25+
атрибут пользователь
26+
*/
27+
UserDto myUser = (UserDto) ((HttpServletRequest) servletRequest).
28+
getSession().
29+
getAttribute("user");
30+
/*
31+
Если данные нашего пользователя не null, то пользователь
32+
попадет на страницу с URL '/unsafe' в противном случае
33+
фильтр перенаправит пользователя на сервлет с URL
34+
'/registration'
35+
*/
36+
if (myUser != null) {
37+
filterChain.doFilter(servletRequest, servletResponse);
38+
} else {
39+
/*
40+
Как и выше HttpServletResponse расширяет servletResponse
41+
и чтобы использовать *.sendRedirect() используем приведение
42+
типов
43+
*/
44+
((HttpServletResponse) servletResponse).sendRedirect("/registration");
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)