Я написал небольшой api отдыха, используя весеннюю загрузку.
url - http: // локальный: 8080 / REST / api / testservice
@RestController
@Scope("request")
@RequestMapping("/api")
public class TestRestController {
private final Log logger = LogFactory.getLog(getClass());
@Autowired
Common common;
@Autowired
CommonVarList commonVarList;
@CrossOrigin
@RequestMapping(value = "/testservice", method = RequestMethod.GET)
public ResponseEntity<ResponseBean> getCheckUser() {
return new ResponseEntity<ResponseBean>(new ResponseBean(Boolean.parseBoolean(commonVarList.BOOLEAN_DEFAULT_TRUE),common.getLocaleMessage(MessageVarList.IB_SERVICE_RUNNING)), HttpStatus.OK);
}
}
Я тоже написал класс перехватчика.
public class TestRestInterceptor implements HandlerInterceptor {
final static Logger logger = Logger.getLogger(IbRestInterceptor.class);
@Autowired
Common common;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//check request time out here
boolean isRequestTimeOut = common.checkUserTimeOut();
if (isRequestTimeOut){
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/api/request/timeout");
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//TODO
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}
@RestController
@Scope("request")
@RequestMapping(path = "/api/request")
public class ResponseRestController {
@Autowired
RequestHandlerService requestHandlerService;
@CrossOrigin
@RequestMapping(value = "/timeout", method = RequestMethod.GET)
public ResponseEntity<ResponseBean> postUserTimeOut(){
ResponseBean responseBean=requestHandlerService.handleRequestTimeOut();
return new ResponseEntity<ResponseBean>(responseBean,HttpStatus.REQUEST_TIMEOUT);
}
}
Я использую httpServletResponse.sendRedirect, чтобы пропустить вызов класса контроллера / api / testservice rest, когда пользовательский запрос истекает по таймауту.
Но он вызывает класс контроллера отдыха / api / testservice, а затем вызывает класс контроллера отдыха / API / запрос / тайм-аут.
Я хочу просто пропустить вызов класса контроллера / api / testservice rest при тайм-ауте пользовательского запроса.
Кто-нибудь может описать, как исправить эту проблему. это будет очень полезно. заранее спасибо
Документы говорят
DispatcherServlet processes a handler in an execution chain, consisting of any number of interceptors, with the handler itself at the end. With this method, each interceptor can decide to abort the execution chain, typically sending a HTTP error or writing a custom response.
И описание метода preHandle
Returns: true if the execution chain should proceed with the next interceptor or the handler itself. Else, DispatcherServlet assumes that this interceptor has already dealt with the response itself.
Поэтому, если вы генерируете исключение или пишете ответ в перехватчике и возвращаете false, вызов не попадет к фактическому обработчику (контроллеру).
return false в твоей прехандле.
не могу вернуть false.Я должен вернуть тело ответа для вызывающего api с тайм-аутом запроса описания.
@Shalika вы пишете ответ прямо в поток, а затем возвращаете false, чтобы пропустить дальнейшую обработку.
Большое спасибо. Ваш ответ помог мне понять внутренний рабочий процесс. Но как я могу остановить запрос, чтобы получить фактический обработчик. Я пробую код ниже. Он не работает. RequestDispatcher requestDispatcher = httpServletRequest.getRequestDispatcher ("/ api / request / timeout" ); requestDispatcher.forward (httpServletRequest, httpServletResponse);