我有这个带有preHandle
和afterCompletion
方法的春季拦截器:
@Slf4j
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String identificationDemande = "";
try {
identificationDemande = new ObjectMapper().readTree(request.getInputStream()).path("test").asText();
} catch (IOException e) {
log.error("JSON format unvalid", e);
return true;
}
if (StringUtils.equals(identificationDemande, "1")) {
log.info("preHandle Test without forward");
return true;
}
RequestDispatcher dispatcher = request.getRequestDispatcher("newUrl");
dispatcher.forward(request, response);
return false;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
log.info("after completion test");
}
}
当identificationDemande==1
和我的webservice调用没有被转发时,就会触发aftercompletion
方法。但当调用identificationDemande!=1
和dispatcher.forward(request, response)
时,aftercompletion
不会被触发。。。我知道这是合乎逻辑的,但在这些转发的呼叫完成后,我是否也可以拦截它们?
- 您已经在
preHandle
中知道dispatcher.forward(request, response)
何时返回。所以你可以
try {
dispatcher.forward(request, response);
//response is complete now
}
finally {
//your logic
}
return false;