SpringBoot自定义拦截器interceptor使用详解

这篇具有很好参考价值的文章主要介绍了SpringBoot自定义拦截器interceptor使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot拦截器Intercepter详解

Intercepter是由Spring提供的Intercepter拦截器,主要应用在日志记录、权限校验等安全管理方便。

使用过程

1.创建自定义拦截器,实现HandlerInterceptor接口,并按照要求重写指定方法

HandlerInterceptor接口源码:

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

根据源码可看出HandlerInterceptor接口提供了三个default方法,这三个方法作用不同,用户想要自定义个一个指定拦截规则的拦截器,需要重写其中一个或者多个方法,这三个方法作用如下:

  • perHandle:preHandle方法的作用是,当请求在进入controller之前拦截请求,对请求进行预处理,比如登录验证(cookie,token,referer)或者单点登录cookie解析都可以在这方法中进行。该方法的返回值,如果返回true,表示放行至controller业务层,如果false,表示请求非法,结束请求并返回错误信息。
  • postHandler:postHandle方法是在请求被controller处理完但是还未传递到业务模板进行渲染拦截,即controller处理完,返回ModelAndView 之前执行该方法,可以操控ModelAndView的值;所以该方法多了一个参数,ModelAndView,这个参数包含了controller处理完后需要传递的Model参数,因此,我们可以在该方法通过ModelAndView对象对返给前端的额视图做一定的修改。
  • afterCompletion:afterCompletion方法作用就是做些收尾工作,在ModelAndView返回前端进行渲染后执行,比如有时候我们需要把每个线程的局部变量(如User信息)放入到TheradLocal中,为了防止内存泄露,在最后需要清除ThreadLocal的内容,此操作就可以放在该方法中执行。

自定义一个获取并返回某个静态资源的内容已整个请求所花费时间的时间拦截器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptor.class);

    private static final ThreadLocal<Long> START_THREAD_LOCAL = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info(uri + " preHandle");
        Long startTime = System.currentTimeMillis();    //获取开始时间
        START_THREAD_LOCAL.set(startTime);  //线程绑定变量(该数据只有当前请求的线程可见)
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info(uri + " postHandle");
        Long startTime = START_THREAD_LOCAL.get();//得到线程绑定的局部变量(开始时间)
        Long endTime = System.currentTimeMillis(); 	//2、结束时间
        Long time = endTime - startTime;
        LOGGER.info("http request all time: " + time + "ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info(uri + " afterCompletion");
        if (START_THREAD_LOCAL != null) {
            START_THREAD_LOCAL.remove();    // 移除ThreadLocal中的局部变量
        }
    }
}
2.添加配置类,实现WebMvcController接口,并添加@Configuration注解,在配置类中,重写addIntercepters方法,添加要拦截的url以及url白名单(需要排除拦截的url)

WebMvcConfigurer源码:

public interface WebMvcConfigurer {

	default void configurePathMatch(PathMatchConfigurer configurer) {
	}

	default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}

	default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	}

	default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
	}

	default void addFormatters(FormatterRegistry registry) {
	}

	default void addInterceptors(InterceptorRegistry registry) {
	}

	default void addResourceHandlers(ResourceHandlerRegistry registry) {
	}

	default void addCorsMappings(CorsRegistry registry) {
	}

	default void addViewControllers(ViewControllerRegistry registry) {
	}

	default void configureViewResolvers(ViewResolverRegistry registry) {
	}

	default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
	}

	default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
	}

	default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
	}

	default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
	}

	default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
	}

	default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
	}

	@Nullable
	default Validator getValidator() {
		return null;
	}

	@Nullable
	default MessageCodesResolver getMessageCodesResolver() {
		return null;
	}
}

根据源码可以看出,WebMvcConfigurer提供了多个方法,并且也都是default方法,也是根据我们自定义配置,重写其中一个或者多个方法,这里就介绍两个常用的方法:

  • addInterceptors:从该方法名就可以了解到该方法是添加拦截器,即将拦截器交给IOC去执行,拦截器需要拦截的路径以及需要排除拦截的路径在该方法中配置。
  • addResourceHandlers:该方法的作用是配置静态资源路径。即某些请求需要读取某个路径下的静态资源内容,需要配置该静态资源的路径,通过该方法可以统一给这些请求配置指定静态资源路径 。

实例:

import com.eureka.intercrpotor.MyInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor())  // 添加拦截器
                .addPathPatterns("/**")          // 配置拦截请求url( ** 表示拦截所有请求url)
                .excludePathPatterns("/hello"); // 排除某些不需要拦截的请求url(即带有/hello请求不会被拦截)
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")   // 配置需要添加静态资源的请求url
                .addResourceLocations("classpath:/mydata/");   //配置静态资源路径
    }
}

测试:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    @GetMapping("/test/interceptor")
    public ResponseEntity<String> testInterceptor() {
        return ResponseEntity.ok("successful");
    }
}

静态资源:

SpringBoot自定义拦截器interceptor使用详解,spring boot,java,spring

 启动项目后访问 localhost:60011/test/interceptor:

SpringBoot自定义拦截器interceptor使用详解,spring boot,java,spring

 控制台打印的日志:

SpringBoot自定义拦截器interceptor使用详解,spring boot,java,spring

 我们再通过url访问静态资源请求 localhost:60011/test.jpg

SpringBoot自定义拦截器interceptor使用详解,spring boot,java,spring文章来源地址https://www.toymoban.com/news/detail-643364.html

到了这里,关于SpringBoot自定义拦截器interceptor使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

    在【 7.1 】管理员图书录入和修改API,当时预告过:并没有写【校验是否是管理员】的逻辑,因为是通用逻辑,会单写一篇来细讲,那么今天就来安排! 角色权限校验 ,是保证接口安全必备的能力:有权限才可以操作!所以,一般对于这种通用逻辑,推荐不与主业务逻辑耦合

    2024年02月16日
    浏览(27)
  • 详解过滤器Filter和拦截器Interceptor的区别和联系

    目录 前言 区别 联系 过滤器(Filter)和拦截器(Interceptor)都是用于在Web应用程序中处理请求和响应的组件,但它们在实现方式和功能上有一些区别。 1. 实现方式: - 过滤器是基于Servlet规范的组件,通过实现 javax.servlet.Filter接口 来定义。过滤器可以在请求被处理之前和响应被发送

    2024年02月11日
    浏览(33)
  • 一文详解过滤器Filter、拦截器Interceptor和切面Aspect的区别

    目录 Filter过滤器 作用 应用场景 拦截器Interceptor Aspect切片 三者对比 执行顺序 拦截层面 过滤器Filter和拦截器Interceptor的区别 Filter 过滤器它是 JavaWeb 的三大组件之一 三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 Filter 过滤器它是 JavaEE 的规范 Filter随web应用的启动

    2024年02月04日
    浏览(33)
  • Spring MVC拦截器Interceptor使用(判断用户登录)

    Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 拦截器可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是

    2024年02月09日
    浏览(30)
  • interceptor拦截器框架

    在实际开发中,我们可能需要拦截部分请求进行一些额外的处理,比如校验用户权限、记录请求日志等。而在Spring Boot中,使用拦截器(Interceptors)可以很方便地对请求进行拦截处理。 首先需要定义一个拦截器,通常需要实现HandlerInterceptor接口,并重写其中的方法: java @Co

    2023年04月16日
    浏览(39)
  • SpringMVC拦截器 (Interceptor)

            Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。         拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的

    2024年01月22日
    浏览(32)
  • C# 12 拦截器 Interceptors

    拦截器Interceptors是一种可以在编译时以声明方式替换原有应用的方法。 这种替换是通过让Interceptors声明它拦截的调用的源位置来实现的。 您可以使用拦截器作为源生成器的一部分进行修改,而不是向现有源编译添加代码。   演示 使用 .NET 8 创建一个控制台应用程序。并在

    2024年03月20日
    浏览(30)
  • SpringMVC的拦截器(Interceptor)

    对于拦截器这节的知识,我们需要学习如下内容: 拦截器概念 入门案例 拦截器参数 拦截器工作流程分析 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如果是

    2024年02月09日
    浏览(31)
  • 过滤器Filter,拦截器Interceptor

    过滤器Filter 快速入门   详情 登录校验-Filter 拦截器Interceptor 简介快速入门 定义拦截器 配置拦截器 详解(拦截路径,执行流程) 登录校验-Interceptor

    2024年02月07日
    浏览(31)
  • springboot在自定义拦截器中使用@Value获取值失败及@RefreshScope 不生效问题

    @RefreshScope注解用于标识在服务配置中心配置更新时,当前 Bean 需要重新注入以获取最新的配置值。但是在这段代码中,@RefreshScope注解标注在拦截器类上,并不会使拦截器实例重新注入。 通常情况下,拦截器是在应用程序启动时由 Spring Framework 实例化和初始化的,而不是在请

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包