• springBoot配置拦截器


    一、实现接口 org.springframework.web.servlet.HandlerInterceptor、或者继承其适配器类org.springframework.web.servlet.handler.HandlerInterceptorAdapter

    适配器类的好处是不用每个方法都去实现,而接口是必须实现

    1. public class OpenInterceptor extends HandlerInterceptorAdapter {
    2. @Override
    3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    4. return true;
    5. }
    6. @Override
    7. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    8. }
    9. @Override
    10. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    11. }
    12. }

    二、添加springBoot配置类,添加拦截器配置使其生效

    配置类需要实现:org.springframework.web.servlet.config.annotation.WebMvcConfigurer

    1. @Configuration
    2. public class CustomWebMvcConfigurer implements WebMvcConfigurer {
    3. @Autowired
    4. private OpenInterceptor OpenInterceptor;
    5. // 添加拦截器
    6. @Override
    7. public void addInterceptors(InterceptorRegistry registry) {
    8. WebMvcConfigurer.super.addInterceptors(registry);
    9. // /v1/open下的接口都要走拦截器,除了/oauth开头的方法
    10. registry.addInterceptor(bgOpenInterceptor)
    11. .addPathPatterns("/v1/open/**")
    12. .excludePathPatterns("/v1/open/oauth/**");
    13. }
    14. }

    三、多个拦截器的执行规则

    1、根据当前请求,找到HandlerExecutionChain【可以处理请求的handler以及handler的所有 拦截器】
    2、先来顺序执行 所有拦截器的 preHandle方法
            ●  如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
            ● 如果当前拦截器返回为false。直接    倒序执行所有已经执行了的拦截器的 afterCompletion;
    3、如果任何一个拦截器返回false。直接跳出不执行目标方法
    4、所有拦截器都返回True。执行目标方法
    5、倒序执行所有拦截器的postHandle方法。
    6、前面的步骤有任何异常都会直接倒序触发 afterCompletion
    7、页面成功渲染完成以后,也会倒序触发 afterCompletion

     

    注:web模式下,springBoot增加自定义配置类,都是实现WebMvcConfigurer,具体可以添加哪种配置,就实现哪个方法即可

    1. public interface WebMvcConfigurer {
    2. default void configurePathMatch(PathMatchConfigurer configurer) {
    3. }
    4. default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    5. }
    6. default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    7. }
    8. default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    9. }
    10. default void addFormatters(FormatterRegistry registry) {
    11. }
    12. default void addInterceptors(InterceptorRegistry registry) {
    13. }
    14. default void addResourceHandlers(ResourceHandlerRegistry registry) {
    15. }
    16. default void addCorsMappings(CorsRegistry registry) {
    17. }
    18. default void addViewControllers(ViewControllerRegistry registry) {
    19. }
    20. default void configureViewResolvers(ViewResolverRegistry registry) {
    21. }
    22. default void addArgumentResolvers(List resolvers) {
    23. }
    24. default void addReturnValueHandlers(List handlers) {
    25. }
    26. default void configureMessageConverters(List> converters) {
    27. }
    28. default void extendMessageConverters(List> converters) {
    29. }
    30. default void configureHandlerExceptionResolvers(List resolvers) {
    31. }
    32. default void extendHandlerExceptionResolvers(List resolvers) {
    33. }
    34. @Nullable
    35. default Validator getValidator() {
    36. return null;
    37. }
    38. @Nullable
    39. default MessageCodesResolver getMessageCodesResolver() {
    40. return null;
    41. }
    42. }

  • 相关阅读:
    阿曼市场最全开发攻略,看这一篇就够了
    游戏 小代码
    使用 Pandera 的 PySpark 应用程序的数据验证
    [golang 流媒体在线直播系统] 2.搭建基于golang的流媒体服务器实现拉流推流,以及Html客户端拉取hls类型的流
    面试:recyclerview的优化
    OS复习笔记ch11-3
    使用 stream buffer 传递数据
    JAVA实现冒泡排序
    基于apache paimon实时数仓全增量一体实时入湖
    数据结构和算法:复杂度分析
  • 原文地址:https://blog.csdn.net/qq_36042938/article/details/126466127