下面是一个例子。
控制器方法:
@GetMapping(path="/home")
public String home() {
log.info("Controller method home() was called.");
return "home";
}
拦截器:
@Slf4j
@Component
public class HomeInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("Method HomeInterceptor.preHandle() was called.");
}
}
网络设置:
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(@NotNull InterceptorRegistry registry) {
register.addInterceptor(new HomeInterceptor()).addPathPatterns("/home");
}
}
配置里主页控制器和主页拦截器匹配的url都是“/home”,实践发现,访问“/home”,控制器方法home()和拦截器HomeInterceptor都会处理该请求,服务器控制台会打印出两条语句:“Controller method home() was called.”和“Method HomeInterceptor.preHandle() was called.”;访问“/home/”,只有控制器方法home()会处理该请求,拦截器HomeInterceptor不会处理该请求,服务器控制台只会打印一条语句:“Controller method home() was called.”。
使用的Spring Boot版本是2.5.3。
使用时感到有些困惑,为什么Spring Web在对控制器方法和拦截器的url匹配会有这样的不同呢?
时隔多年再回来看这个问题,发现Spring不会再为控制器匹配的路径末尾添加“/”,不知道是我当错搞错了还是Spring修改了代码