【发布时间】:2015-01-15 16:55:22
【问题描述】:
当我使用自定义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,是否可以避免这种情况?
【问题讨论】:
-
查看this,其中详细解释了该行为。
-
@JavaBond 您能否提供更多详细信息,因为我还没有从那篇帖子中找到解释。
-
引用accepted answer
Roughly speaking. A DeferredResult is associated with an open request. When the request completes, the DeferredResult is removed from the map, and then, the client issues a new long polling request, which adds a new DeferredResult instance这意味着客户端发出了一个新请求,DeferredResult作为响应附加到该请求。这反过来解释了为什么每个请求都有两个拦截器调用。如果您需要进一步的解释,请告诉我。 -
我想阅读 HTTP Post 并删除 SOAP 标签,然后将 XML 数据简单地传递给 Rest 端点,这可能吗?
标签: java spring-mvc