ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# Spring MVC 拦截器示例 – XML 和 Java 注解配置 > 原文: [https://howtodoinjava.com/spring-core/spring-mvc-interceptor-example/](https://howtodoinjava.com/spring-core/spring-mvc-interceptor-example/) 在本[ Spring 教程](https://howtodoinjava.com/java-spring-framework-tutorials/)中,我们将学习在 [spring mvc](https://howtodoinjava.com/spring-mvc-tutorial/) 应用程序中使用 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 示例` ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class DemoInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Inside post handle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception { System.out.println("Inside after completion"); } } ``` #### 1.2. 通过扩展`HandlerInterceptorAdapter`的 Spring 拦截器 [`HandlerInterceptorAdapter`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/handler/HandlerInterceptorAdapter.html)是`HandlerInterceptor`接口的抽象适配器类。 它可以帮助我们仅实现所需的前置或后置处理器方法。 我们没有被迫实现所有方法。 此抽象类中方法的所有默认实现均为“空”。 `HandlerInterceptorAdapter 示例` ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.springframework.web.servlet.ModelAndView; public class DemoInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Inside post handle"); } } ``` ## 2\. Spring 拦截器示例 #### 2.1. Spring Web Maven 依赖项 添加 [Spring 5](https://howtodoinjava.com/spring-5-tutorial/) Web 依赖关系以创建 Spring MVC 应用程序。 ```java <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.6.RELEASE</version> </dependency> ``` #### 2.2. 编写 Spring 拦截器 ```java package com.howtodoinjava.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class DemoInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Inside post handle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception { System.out.println("Inside after completion"); } } ``` #### 2.3. 在 bean 配置中配置 spring 拦截器 ##### 2.3.1. Spring 拦截器 XML 配置 XML 配置有助于添加将在其上调用拦截器的**路径模式**。 另外,我们可以将拦截器配置为对所有 Web 请求都调用。 ```java <!-- Configures Interceptors --> <mvc:interceptors> <!-- This XML will intercept all URIs --> <bean class="com.howtodoinjava.interceptor.DemoInterceptor"></bean> <!-- This XML will apply interceptor to only configured URIs --> <!-- <mvc:interceptor> <mvc:mapping path="/users"></mvc:mapping> <bean class="com.howtodoinjava.interceptor.DemoInterceptor"></bean> <mvc:interceptor> --> </mvc:interceptors> ``` ##### 2.3.2. Spring 拦截器 Java 配置 ```java @EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean DemoInterceptor demoInterceptor() { return new DemoInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(demoInterceptor()); } } ``` #### 2.4. 示例 现在,如果我们启动服务器并访问 URL:`http://localhost:8080/firstSpringApplication/users`,我们将在控制台输出中看到在拦截器方法中编写的语句。 下载给定的源代码以使用它,并更详细地了解 Spring MVC 拦截器。 [下载源码](https://drive.google.com/file/d/0B7yo2HclmjI4amh6cEhvblBtQjg/view?usp=drive_web) 学习愉快!