SpringMVC之拦截器

发布时间:2023年12月24日

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
在 SpringMVC 框架中,拦截器是一个非常重要的组件,它可以在请求处理之前和之后进行额外的操作,比如日志记录、权限验证、参数校验等。拦截器的使用可以大大提高应用的可扩展性和可维护性。
通过使用拦截器,我们可以将一些通用的功能独立出来,实现代码的复用。这样,当需要添加新的功能或修改现有功能时,只需要修改拦截器即可,而不需要修改每个请求处理的控制器。
此外,拦截器还可以提供更好的安全性。我们可以在拦截器中进行权限验证,只有具有相应权限的用户才能访问某些页面或操作。
总之,拦截器是 SpringMVC 框架中一个非常有用的工具,它可以帮助我们实现更好的代码复用、提高应用的可扩展性和可维护性,同时还可以提供更好的安全性。在后续的博客文章中,我将详细介绍如何使用 SpringMVC 拦截器来实现这些功能。敬请期待!


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是拦截器?

在SpringMVC中,拦截器是一种用于处理请求的AOP(面向方面编程)技术。它们允许你在请求到达控制器之前或之后进行额外的操作,比如日志记录、权限检查、参数验证等。
Spring提供了一个拦截器接口HandlerInterceptor,你可以实现这个接口来创建自己的拦截器。拦截器可以在请求处理的不同阶段进行干预,包括:

  • 前置拦截:在请求到达控制器之前执行,可以用于进行权限检查、参数验证等操作。
  • 后置拦截:在控制器方法执行之后,但在视图渲染之前执行,可以用于进行结果处理、日志记录等操作。
  • 返回结果拦截:在视图渲染之后执行,可以用于进行响应处理、异常处理等操作。
    你可以将多个拦截器按顺序配置到Spring容器中,它们将按照指定的顺序依次执行。这样,你可以在请求处理的不同阶段添加自己的逻辑,以实现更灵活的请求处理。
    拦截器在SpringMVC中的使用非常广泛,可以帮助你提高应用的可维护性和扩展性。

二、拦截器与过滤器的区别

  • 作用范围:拦截器是Spring框架提供的,用于在Spring管理的Bean之间进行拦截;而过滤器是Servlet规范中的一部分,用于在Servlet容器级别进行拦截。
  • 调用时机:拦截器在Spring的请求处理管道中调用,即在DispatcherServlet处理请求之前或之后;而过滤器在Servlet容器的请求处理管道中调用,即在HttpServlet处理请求之前或之后。
  • 拦截目标:拦截器可以拦截Spring管理的所有Bean的方法调用,包括控制器、服务层、数据访问层等;而过滤器只能拦截通过HttpServlet处理的请求。
  • 拦截方式:拦截器通过AOP(面向方面编程)的方式实现,使用动态代理来拦截目标方法的调用;而过滤器通过在Servlet容器中注册来实现,在请求到达HttpServlet之前或之后进行拦截。
  • 拦截顺序:在Spring的请求处理管道中,拦截器按照配置的顺序进行调用;而在Servlet容器的请求处理管道中,过滤器按照它们在web.xml文件中配置的顺序进行调用。
    总体来说,拦截器和过滤器都是用于处理请求的机制,但它们的作用范围、调用时机和实现方式略有不同。在实际应用中,根据需求选择使用合适的机制来实现你的需求。

三、拦截器的使用

1.创建一个名为CustomInterceptor的 Java 类,实现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 CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在该方法中编写前置拦截逻辑,返回值决定是否继续后续请求处理
        // 可以获取请求信息、修改请求、响应头、验证权限等
        // 如果需要拦截请求,可以返回 false ,否则返回 true
        // 请求到达Controller前执行
        System.out.println("前置拦截");
        return true; 
    }
    //跳转页面前执行的方法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 在该方法中编写后置处理逻辑
        System.out.println("后置处理");
    }
    // 跳转页面后执行,此时已经不能向Request域添加数据
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // 该方法在请求处理完成后触发,无论是否出现异常
        // 可以进行清理资源、记录日志等操作
        System.out.println("请求处理完成后");
    }
}

2.配置拦截器

核心文件配置

单个拦截器配置

<!-- 配置拦截器-->
<mvc:interceptors>  
  <mvc:interceptor>    
    <!-- 配置拦截器的作用路径-->    
    <mvc:mapping path="/**"/>    
    <!-- 拦截器对象 -->    
    <bean class="包名.CustomInterceptor"/> 
  </mvc:interceptor>
</mvc:interceptors>

全局拦截器配置

全局拦截器可以拦截所有控制器处理的URL,作用等于/**

<!-- 配置拦截器 -->
<mvc:interceptors>  
  <!-- 全局拦截器 -->  
  <bean class="com.itbaizhan.interceptor.MyInterceptor">
  </bean>
</mvc:interceptors>

Java配置类配置

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 CustomInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(CustomInterceptor registry) {
        // 将 CustomInterceptor 添加到拦截器列表中
        registry.addInterceptor(new CustomInterceptor())
                // 指定要拦截的 URL 模式
                .addPathPatterns("/api/**");
    }
}

四、拦截器链与执行顺序

如果一个URL能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置文件中配置的从上到下执行


总结

提示:这里对文章进行总结:

在 SpringMVC 框架中,拦截器是一个非常重要的组件,它可以在请求处理之前和之后进行额外的操作,如日志记录、权限检查、数据加解密等。通过使用拦截器,可以提高应用的可扩展性和可维护性。

拦截器的作用

  • 拦截请求:在请求到达控制器之前,可以对请求进行拦截,执行一些前置处理逻辑,如参数验证、权限检查等。
  • 处理响应:在控制器方法执行之后,可以对响应进行拦截,执行一些后置处理逻辑,如响应头设置、数据加密等。
  • 异常处理:拦截器可以捕获控制器方法抛出的异常,并进行相应的处理,如记录异常信息、返回错误页面等。、
  • 统一处理:通过拦截器,可以对所有请求进行统一的处理,避免在每个控制器方法中重复编写相同的逻辑。

拦截器的使用

实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类,并重写相应的方法。

拦截器的配置

  • 在 Spring 的配置文件中,使用mvc:interceptors标签来配置拦截器。
  • 创建拦截器配置类,实现 WebMvcConfigurer,进行相应配置

拦截器执行顺序

如果一个URL能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置文件中配置的从上到下执行

拦截器注意事项

  • 拦截器方法的返回值:preHandle方法的返回值决定了是否继续后续的请求处理;postHandle方法和afterCompletion方法的返回值没有实际作用,可以忽略。
  • 拦截器的执行时机:拦截器是在请求的处理过程中执行的,因此要注意避免在拦截器中进行耗时的操作,以免影响请求的响应时间。
  • 拦截器的异常处理:如果在拦截器中捕获了异常,要确保进行适当的处理,避免将异常信息直接返回给客户端。
  • 拦截器的作用范围:拦截器是在 Spring 的DispatcherServlet处理请求的过程中调用的,因此它只能拦截通过DispatcherServlet处理的请求。
    在实际开发过程中,合理使用拦截器可以大大提高应用的可维护性和扩展性。但是也要注意不要过度使用拦截器,避免造成不必要的性能开销。
    希望这篇博客对你有所帮助,如果你有任何问题或建议,请随时评论或联系我。谢谢阅读!
文章来源:https://blog.csdn.net/liubopro666/article/details/135185489
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。