我正在使用 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 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"));
}
根据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());
}
}
步骤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());
}
}