# 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)

学习愉快！