如何在Spring Boot 3和Spring Framework 6中注册拦截器

问题描述 投票:0回答:3

我正在使用 Spring Boot

3.1.0-SNAPSHOT
构建后端,它使用
Spring Framework 6x

拦截器:

@Slf4j
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle");
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion");
    }
}

在之前的版本(Spring Boot 2)中,添加Interceptor的方式是:

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
     registry.addInterceptor( new MyInterceptor());
    }

}

现在添加此类配置类的正确方法是:

@Configuration
public class AppConfig {

    // Not working now
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
     registry.addInterceptor( new MyInterceptor()).addPathPatterns("/api/**");
    }

}

现在如何添加拦截器?

我已经尝试过:

@Configuration
public class AppConfig {

    @Bean
    public InterceptorRegistry interceptorRegistry() {
        InterceptorRegistry registry = new InterceptorRegistry();
        registry.addInterceptor(new MyInterceptor());
        return registry;
    }

}

不工作...

一个有效的示例是使用

MappedInterceptor
:

@Configuration
public class AppConfig {

    @Bean
    public MappedInterceptor loginInter() {
        return new MappedInterceptor(null, new MyInterceptor());
    }

}

但是根据这里的其他线程,例如这个 MappedInterceptor Bean Vs WebMvcConfigurer addInterceptors。添加 Spring HandlerInterceptor 的正确(现代)方法是什么?,说正确的方法是使用

registry.addInterceptor()
。可悲的是这种方式不适合我。

现在如何正确注册拦截器?

spring-boot spring-mvc interceptor
3个回答
2
投票

我仍然能够在 Spring Boot 3 中使用 HandlerInterceptor,替换 jakarta 的 javax 类导入:

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@Component
public class AuthorizeInterceptorConfig implements HandlerInterceptor {

@Autowired
private AuthorizeController authorizeController;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse 
 response, Object handler) {
    return authorizeController.isValidUser(request.getHeader("X-Document-Id"));
}

0
投票

根据https://docs.spring.io/spring-boot/docs/3.0.5/reference/pdf/spring-boot-reference.pdf

对于此用例,我们仍然可以使用

@Configuration
带注释的类来实现
WebMvcConfigurer
但没有
@EnableWebMvc
注释。所以,以下内容仍然有效。

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
     registry.addInterceptor( new CustomInterceptor());
    }

}

0
投票

步骤1:

   @Component
    public class RequestInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(@Nullable HttpServletRequest request,
                                 @Nullable HttpServletResponse response, @Nullable Object object) {
            System.out.println("interceptor");
            try {
                System.out.println(new String(request.getInputStream().readAllBytes()));
               //printing body
            } catch (IOException e) {
                System.out.println("interceptor error: "+e.getMessage());
            }
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView model) {
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) {
        }
    }

第2步:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RequestInterceptor());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.