Spring Boot 2.X (9): Spring MVC — перехватчик

Spring Boot

перехватчик

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

образец кода

github

Облако кода

Если не указано иное, авторские права на эту статью принадлежатутренний туманВсе, пожалуйста, указывайте источник при перепечатке.

Оригинальное название: Spring Boot 2.X (9): Spring MVC — Interceptor

Оригинальный адрес: https://www.zwqh.top/article/info/18

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