当我使用自定义的 HandlerInterceptor
并且我的控制器返回了 DeferredResult
时,我的自定义拦截器的 preHandle
方法在每个请求上被调用两次。考虑一个玩具示例。
我的自定义拦截器:
public class MyInterceptor implements HandlerInterceptor {
static int i = 0;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(i++);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
我的Spring Java配置:
@Configuration
@EnableWebMvc
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
我的控制器:
@Controller
public class MyController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
public DeferredResult<String> test() {
DeferredResult<String> df = new DeferredResult<String>();
df.setResult("blank");
return df;
}
}
每次页面加载时,我会看到preHandle
方法输出两次。然而,如果我修改MyController
以返回仅为“空白”模板(而不是使用带有“空白”模板的DeferredResult
),则每次页面加载时只会看到一次preHandle
方法的输出。
因此,我的问题是为什么在使用DeferredResult
时preHandle
被调用两次,是否有可能避免这种情况?