Spring MVC中如何实现拦截器功能?

润信云 技术支持

Spring MVC 中实现拦截器功能详解

在 Spring MVC 应用程序中,拦截器(Interceptor)是一种强大的组件,它可以在请求到达控制器之前或之后执行一些通用的处理逻辑,例如日志记录、权限验证、性能监控等。下面将详细介绍如何在 Spring MVC 中实现拦截器功能。

一、创建拦截器类

首先,需要创建一个实现 HandlerInterceptor 接口的类。HandlerInterceptor 接口包含三个方法:

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在请求到达控制器之前被调用。如果返回 true,请求将继续处理;如果返回 false,则请求将被中断,后续的拦截器和控制器都不会被调用。
  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在控制器方法执行之后,视图渲染之前被调用。可以在这个方法中对 ModelAndView 进行修改。
  3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在整个请求处理完成之后,包括视图渲染之后被调用。通常用于资源清理等操作。

以下是一个简单的拦截器示例:

import org.springframework.Web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Pre - handle method executed before controller");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Post - handle method executed after controller but before view rendering");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("After - completion method executed after view rendering");
    }
}

二、配置拦截器

创建拦截器类之后,需要在 Spring MVC 的配置文件中进行配置,将拦截器与特定的 URL 模式关联起来。可以通过继承 WebMvcConfigurer 接口并实现其 addInterceptors 方法来完成配置。

以下是一个配置类的示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
              .addPathPatterns("/**") // 拦截所有请求
              .excludePathPatterns("/login", "/static/**"); // 排除登录页面和静态资源请求
    }
}

在上述配置中,addInterceptor 方法注册了我们创建的 MyInterceptoraddPathPatterns 方法指定了拦截的 URL 模式,excludePathPatterns 方法指定了需要排除的 URL 模式。

三、拦截器的执行顺序

如果配置了多个拦截器,它们的执行顺序如下:

  1. preHandle 方法按照拦截器注册的顺序依次执行。
  2. 如果所有拦截器的 preHandle 方法都返回 true,控制器方法才会被调用。
  3. postHandle 方法按照拦截器注册顺序的逆序执行。
  4. afterCompletion 方法同样按照拦截器注册顺序的逆序执行。

通过合理利用拦截器,可以在 Spring MVC 应用中优雅地实现各种通用的处理逻辑,提高代码的复用性和可维护性。

本文链接:https://blog.runxinyun.com/post/592.html 转载需授权!

分享到:
版权声明
网站名称: 润信云资讯网
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮件:7104314@qq.com
网站部分内容来源于网络,版权争议与本站无关。请在下载后的24小时内从您的设备中彻底删除上述内容。
如无特别声明本文即为原创文章仅代表个人观点,版权归《润信云资讯网》所有,欢迎转载,转载请保留原文链接。
0 46

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。