原文: https://howtodoinjava.com/spring-core/spring-mvc-interceptor-example/

在本 Spring 教程中,我们将学习在 spring mvc 应用程序中使用 spring mvc 拦截器。 本教程非常简短,仅关注 Spring 拦截器配置和用法。

众所周知,拦截器是特殊的 Web 编程结构,每次发出某些预先配置的 Web 请求时都会被调用。 由于它们的重要性,它们始终是产品生命周期中早期设计的最重要和最基本的功能部分。

拦截器通常在将其移交给控制器处理器方法之前进行一些处理。

1. 创建 Spring MVC 拦截器

1.1. 通过实现HandlerInterceptor的 Spring MVC 拦截器

HandlerInterceptor接口定义了 3 种方法。

  1. preHandle(request, response, handler) – 用于在移交给处理器方法之前拦截请求。 这里的handler是选择的用于处理请求的处理器对象。
  2. postHandler(request, response, handler, modelAndView) – 用于在处理器完成请求处理后拦截请求,但DispatcherServlet尚未呈现视图。
  3. afterCompletion(request, response, handler, exception) – 处理器执行完成并且视图也呈现后,将调用它。

HandlerInterceptor 示例

  1. import javax.servlet.http.HttpServletRequest;
  2. import javax.servlet.http.HttpServletResponse;
  3. import org.springframework.web.servlet.HandlerInterceptor;
  4. import org.springframework.web.servlet.ModelAndView;
  5. public class DemoInterceptor implements HandlerInterceptor
  6. {
  7. @Override
  8. public boolean preHandle(HttpServletRequest request,
  9. HttpServletResponse response, Object handler) throws Exception {
  10. System.out.println("Inside pre handle");
  11. return true;
  12. }
  13. @Override
  14. public void postHandle(HttpServletRequest request,
  15. HttpServletResponse response, Object handler,
  16. ModelAndView modelAndView) throws Exception {
  17. System.out.println("Inside post handle");
  18. }
  19. @Override
  20. public void afterCompletion(HttpServletRequest request,
  21. HttpServletResponse response, Object handler, Exception exception)
  22. throws Exception {
  23. System.out.println("Inside after completion");
  24. }
  25. }

1.2. 通过扩展HandlerInterceptorAdapter的 Spring 拦截器

HandlerInterceptorAdapterHandlerInterceptor接口的抽象适配器类。

它可以帮助我们仅实现所需的前置或后置处理器方法。 我们没有被迫实现所有方法。 此抽象类中方法的所有默认实现均为“空”。

HandlerInterceptorAdapter 示例

  1. import javax.servlet.http.HttpServletRequest;
  2. import javax.servlet.http.HttpServletResponse;
  3. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  4. import org.springframework.web.servlet.ModelAndView;
  5. public class DemoInterceptor extends HandlerInterceptorAdapter
  6. {
  7. @Override
  8. public boolean preHandle(HttpServletRequest request,
  9. HttpServletResponse response, Object handler) throws Exception {
  10. System.out.println("Inside pre handle");
  11. return true;
  12. }
  13. @Override
  14. public void postHandle(HttpServletRequest request,
  15. HttpServletResponse response, Object handler,
  16. ModelAndView modelAndView) throws Exception {
  17. System.out.println("Inside post handle");
  18. }
  19. }

2. Spring 拦截器示例

2.1. Spring Web Maven 依赖项

添加 Spring 5 Web 依赖关系以创建 Spring MVC 应用程序。

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-web</artifactId>
  4. <version>5.0.6.RELEASE</version>
  5. </dependency>

2.2. 编写 Spring 拦截器

  1. package com.howtodoinjava.interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.web.servlet.HandlerInterceptor;
  5. import org.springframework.web.servlet.ModelAndView;
  6. public class DemoInterceptor implements HandlerInterceptor
  7. {
  8. @Override
  9. public boolean preHandle(HttpServletRequest request,
  10. HttpServletResponse response, Object handler) throws Exception {
  11. System.out.println("Inside pre handle");
  12. return true;
  13. }
  14. @Override
  15. public void postHandle(HttpServletRequest request,
  16. HttpServletResponse response, Object handler,
  17. ModelAndView modelAndView) throws Exception {
  18. System.out.println("Inside post handle");
  19. }
  20. @Override
  21. public void afterCompletion(HttpServletRequest request,
  22. HttpServletResponse response, Object handler, Exception exception)
  23. throws Exception {
  24. System.out.println("Inside after completion");
  25. }
  26. }

2.3. 在 bean 配置中配置 spring 拦截器

2.3.1. Spring 拦截器 XML 配置

XML 配置有助于添加将在其上调用拦截器的路径模式。 另外,我们可以将拦截器配置为对所有 Web 请求都调用。

  1. <!-- Configures Interceptors -->
  2. <mvc:interceptors>
  3. <!-- This XML will intercept all URIs -->
  4. <bean class="com.howtodoinjava.interceptor.DemoInterceptor"></bean>
  5. <!-- This XML will apply interceptor to only configured URIs -->
  6. <!--
  7. <mvc:interceptor>
  8. <mvc:mapping path="/users"></mvc:mapping>
  9. <bean class="com.howtodoinjava.interceptor.DemoInterceptor"></bean>
  10. <mvc:interceptor>
  11. -->
  12. </mvc:interceptors>

2.3.2. Spring 拦截器 Java 配置
  1. @EnableWebMvc
  2. @Configuration
  3. public class WebConfig extends WebMvcConfigurerAdapter {
  4. @Bean
  5. DemoInterceptor demoInterceptor() {
  6. return new DemoInterceptor();
  7. }
  8. @Override
  9. public void addInterceptors(InterceptorRegistry registry) {
  10. registry.addInterceptor(demoInterceptor());
  11. }
  12. }

2.4. 示例

现在,如果我们启动服务器并访问 URL:http://localhost:8080/firstSpringApplication/users,我们将在控制台输出中看到在拦截器方法中编写的语句。

下载给定的源代码以使用它,并更详细地了解 Spring MVC 拦截器。

下载源码

学习愉快!