Quando utilizzo l'HandlerInterceptor
personalizzato e il mio controller restituisce DeferredResult
, il metodo preHandle
del mio intercettore personalizzato chiamato due volte su ogni richiesta. Considera un esempio di giocattolo.Spring MVC InterceptorHandler ha chiamato due volte con DeferredResult
mio intercettore personalizzato:
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 {
}
}
la mia primavera Java configurazione:
@Configuration
@EnableWebMvc
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
mio controller:
@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;
}
}
Così, ad ogni caricamento della pagina vedo due uscite da preHandle
metodo . Tuttavia, se modifico MyController
per restituire solo un modello "vuoto" (anziché DeferredResult
con modello "vuoto"), vedo solo un'uscita da preHandle
su ogni caricamento di pagina.
Quindi, la mia domanda è perché preHandle
chiamato due volte quando uso DeferredResult
ed è possibile evitare questo?
vedi [questa] (http://stackoverflow.com/questions/15357990/understanding-the-spring-mvcs-deferredresult-class-in-the-context-of-the-spring), che ha il comportamento spiegato in dettaglio. –
@JavaBond puoi fornire ulteriori dettagli, dal momento che non ho capito la spiegazione di quel post. –
citando dalla [risposta accettata] (http://stackoverflow.com/a/15384965/1910582) 'In parole povere. Un DeferredResult è associato a una richiesta aperta. Una volta completata la richiesta, DeferredResult viene rimosso dalla mappa e, successivamente, il client invia una nuova richiesta di polling lunga, che aggiunge una nuova istanza DeferredResult' che significa che viene emessa una nuova richiesta dal client a cui è associato il 'DeferredResult' risposta. Che a sua volta spiega perché hai due invocazioni intercettore per ogni richiesta. Fammi sapere se hai bisogno di ulteriori spiegazioni. –