原文: 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 种方法。
preHandle(request, response, handler)– 用于在移交给处理器方法之前拦截请求。 这里的handler是选择的用于处理请求的处理器对象。postHandler(request, response, handler, modelAndView)– 用于在处理器完成请求处理后拦截请求,但DispatcherServlet尚未呈现视图。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{@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {System.out.println("Inside pre handle");return true;}@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("Inside post handle");}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception exception)throws Exception {System.out.println("Inside after completion");}}
1.2. 通过扩展HandlerInterceptorAdapter的 Spring 拦截器
HandlerInterceptorAdapter是HandlerInterceptor接口的抽象适配器类。
它可以帮助我们仅实现所需的前置或后置处理器方法。 我们没有被迫实现所有方法。 此抽象类中方法的所有默认实现均为“空”。
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{@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {System.out.println("Inside pre handle");return true;}@Overridepublic 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{@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {System.out.println("Inside pre handle");return true;}@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("Inside post handle");}@Overridepublic 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@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {@BeanDemoInterceptor demoInterceptor() {return new DemoInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(demoInterceptor());}}
2.4. 示例
现在,如果我们启动服务器并访问 URL:http://localhost:8080/firstSpringApplication/users,我们将在控制台输出中看到在拦截器方法中编写的语句。
下载给定的源代码以使用它,并更详细地了解 Spring MVC 拦截器。
学习愉快!
