Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 41bfd3b

Browse files
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
Lines changed: 23 additions & 0 deletions
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+
}
Lines changed: 44 additions & 0 deletions
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+
}
Lines changed: 25 additions & 0 deletions
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+
}
Lines changed: 29 additions & 0 deletions
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+
}
Lines changed: 47 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /