Пропустить вызов класса контроллера rest, используя обработчик intercptor - PullRequest
0 голосов
/ 17 октября 2018

Я написал небольшой API отдыха с помощью пружинной загрузки.

url - http://localhost: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 {}
}

Класс контроллера времени TimeOut

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

Но он вызывает / api / testservice класс контроллера покоя и затем вызывает / api / request /timeout класс контроллера покоя.

Я хочу просто пропустить вызов / api / testservice класс контроллера покоя при тайм-ауте запроса пользователя.

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

1 Ответ

0 голосов
/ 17 октября 2018

Docs говорит:

DispatcherServlet обрабатывает обработчик в цепочке выполнения, состоящей из любого числа перехватчиков, с самим обработчиком в конце.С помощью этого метода каждый перехватчик может решить прервать цепочку выполнения, обычно отправляя ошибку HTTP или записывая собственный ответ.

И описание o preHandle метод

Возвращает: true, если цепочка выполнения должна продолжить работу со следующим перехватчиком или самим обработчиком.В противном случае DispatcherServlet предполагает, что этот перехватчик уже имел дело с самим ответом.

Так что, если вы выбросите исключение или напишите ответ в перехватчике и вернете false, вызов не получит фактический обработчик (контроллер).

...