Пропустить вызов класса контроллера отдыха с использованием обработчика-перехватчика

Я написал небольшой 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);
    }
}

Я тоже написал класс перехватчика.

Класс Intercetor

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 {}
}

Класс контроллера TimeOut Rest

@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 при тайм-ауте пользовательского запроса.

Кто-нибудь может описать, как исправить эту проблему. это будет очень полезно. заранее спасибо

0
0
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Документы говорят

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, вызов не попадет к фактическому обработчику (контроллеру).

Большое спасибо. Ваш ответ помог мне понять внутренний рабочий процесс. Но как я могу остановить запрос, чтобы получить фактический обработчик. Я пробую код ниже. Он не работает. RequestDispatcher requestDispatcher = httpServletRequest.getRequestDispatcher ("/ ‌ api / request / timeout" ‌); requestDispatcher.forward (httpServletRequest, httpServletResponse);

Shalika 18.10.2018 07:44
return false в твоей прехандле.
Antoniossss 18.10.2018 09:54

не могу вернуть false.Я должен вернуть тело ответа для вызывающего api с тайм-аутом запроса описания.

Shalika 18.10.2018 10:10

@Shalika вы пишете ответ прямо в поток, а затем возвращаете false, чтобы пропустить дальнейшую обработку.

Antoniossss 19.10.2018 08:06

Другие вопросы по теме