перехватчик
1. Введение
Перехватчик (Interceptor) в Spring MVC аналогичен фильтру в разработке сервлетов. Он в основном используется для перехвата пользовательских запросов и соответствующей обработки их. Он также является воплощением идей АОП-программирования. Нижний слой достраивается через динамический прокси режим.
2. Определите класс реализации
Перехватчики могут быть реализованы двумя способами: 1. Реализовать интерфейс HandlerInterceptor 2. Наследовать абстрактный класс HandlerInterceptorAdapter (см. нижний слой исходного кода также реализован через интерфейс HandlerInterceptor)
3. Введение в метод HandlerInterceptor
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//进行逻辑判断,如果ok就返回true,不行就返回false,返回false就不会处理请求
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
preHandle: вызывается до того, как бизнес-обработчик обработает запрос. Предварительную обработку можно использовать для кодирования, контроля безопасности, проверки разрешений и т. д.; postHandle: выполняется после того, как бизнес-процессор завершил обработку запроса и перед созданием представления. afterCompletion: вызывается после того, как DispatcherServlet полностью обработает запрос и может использоваться для очистки ресурсов и т. д.
4. Сценарии применения
1. Запись журнала: запись журнала запроса информации для мониторинга информации, статистики информации, расчета PV (просмотра страницы) и т. д.; 2. Аутентификация входа: например, обнаружение входа в систему, введите процессор, чтобы определить, следует ли войти в систему; 3. Мониторинг производительности: время выполнения метода обнаружения; 4. Другое общее поведение.
5. Разница с фильтром «Фильтр»
1. Перехватчики основаны на механизме отражения Java, а фильтры основаны на обратных вызовах функций. 2. Перехватчик не зависит от контейнера сервлета, а фильтр зависит от контейнера сервлета. 3. Перехватчики могут работать только с запросами контроллера, тогда как фильтры могут работать почти со всеми запросами. 4. Перехватчики могут обращаться к объектам в контексте действия и стеке значений, а фильтры — нет. 5. В жизненном цикле контроллера перехватчик может вызываться несколько раз, а фильтр — только один раз при инициализации контейнера. 6. Перехватчики могут получить каждый компонент в контейнере IOC, а фильтры — нет. Это очень важно, внедрение сервиса в перехватчик может вызвать бизнес-логику.
Выполнение
одиночный перехватчик
1. Создайте новый перехватчик
public class Test1Interceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("执行preHandle方法-->01");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("执行postHandle方法-->02");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("执行afterCompletion方法-->03");
}
}
2. Настройте перехватчик
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/*
* 拦截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new Test1Interceptor()) // 添加拦截器
.addPathPatterns("/**") // 添加拦截路径
.excludePathPatterns(// 添加排除拦截路径
"/hello").order(0);//执行顺序
super.addInterceptors(registry);
}
}
3. Протестируйте перехватчик
@RestController
public class TestController {
@RequestMapping("/hello")
public String getHello() {
System.out.println("这里是Hello");
return "hello world";
}
@RequestMapping("/test1")
public String getTest1() {
System.out.println("这里是Test1");
return "test1 content";
}
@RequestMapping("/test2")
public String getTest2() {
System.out.println("这里是Test2");
return "test2 content";
}
}
4. Процесс выполнения одиночного перехватчика
Тест с браузером:http://127.0.0.1:8080/helloрезультат:
这里是Hello
http://127.0.0.1:8080/test1,http://127.0.0.1:8080/test2результат:
执行preHandle方法-->01
这里是Test1
执行postHandle方法-->02
执行afterCompletion方法-->03
несколько перехватчиков
1. Создайте два новых перехватчика
Test1Interceptor
public class Test1Interceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("执行Test1Interceptor preHandle方法-->01");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("执行Test1Interceptor postHandle方法-->02");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("执行Test1Interceptor afterCompletion方法-->03");
}
}
Test2Interceptor
public class Test2Interceptor extends HandlerInterceptorAdapter{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("执行Test2Interceptor preHandle方法-->01");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("执行Test2Interceptor postHandle方法-->02");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("执行Test2Interceptor afterCompletion方法-->03");
}
}
2. Настройте перехватчик
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/*
* 拦截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new Test1Interceptor()) // 添加拦截器1
.addPathPatterns("/**") // 添加拦截路径
.excludePathPatterns(// 添加排除拦截路径
"/hello")
.order(0);
registry.addInterceptor(new Test2Interceptor()) // 添加拦截器2
.addPathPatterns("/**") // 添加拦截路径
.excludePathPatterns(// 添加排除拦截路径
"/test1")
.order(1);
super.addInterceptors(registry);
}
}
3. Протестируйте перехватчик
@RestController
public class TestController {
@RequestMapping("/hello")
public String getHello() {
System.out.println("这里是Hello");
return "hello world";
}
@RequestMapping("/test1")
public String getTest1() {
System.out.println("这里是Test1");
return "test1 content";
}
@RequestMapping("/test2")
public String getTest2() {
System.out.println("这里是Test2");
return "test2 content";
}
}
4. Процесс выполнения нескольких перехватчиков
Тест с браузером:http://127.0.0.1:8080/test2результат:
执行Test1Interceptor preHandle方法-->01
执行Test2Interceptor preHandle方法-->01
这里是Test2
执行Test2Interceptor postHandle方法-->02
执行Test1Interceptor postHandle方法-->02
执行Test2Interceptor afterCompletion方法-->03
执行Test1Interceptor afterCompletion方法-->03
В качестве примера, просто говоря, процесс выполнения нескольких перехватчиковпервый вышел последним.
Пример простого токена
1. Перехватчик
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("执行Test1Interceptor preHandle方法-->01");
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
response.getWriter().println("token不存在");
return false;
}
return true;
}
2. Тесты и результаты
Токен не прошел:
执行Test1Interceptor preHandle方法-->01
Проходной токен:
执行Test1Interceptor preHandle方法-->01
页码:1
页码大小:10
执行Test1Interceptor postHandle方法-->02
执行Test1Interceptor afterCompletion方法-->03
образец кода
Если не указано иное, авторские права на эту статью принадлежатутренний туманВсе, пожалуйста, указывайте источник при перепечатке.
Оригинальное название: Spring Boot 2.X (9): Spring MVC — Interceptor
Оригинальный адрес: https://www.zwqh.top/article/info/18
Если статья была вам полезна, отсканируйте код и подпишитесь на мой официальный аккаунт, статья постоянно обновляется...