Spring MVC 拦截器示例 – XML 和 Java 注解配置

Spring MVC 拦截器示例 – XML 和 Java 注解配置

原文: 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 示例

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 拦截器

HandlerInterceptorAdapterHandlerInterceptor接口的抽象适配器类。

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

HandlerInterceptorAdapter 示例

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 Web 依赖关系以创建 Spring MVC 应用程序。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.6.RELEASE</version>
</dependency>

2.2. 编写 Spring 拦截器

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 请求都调用。

<!-- 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 配置
@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 拦截器。

下载源码

学习愉快!