Spring 使用处理程序interptor跳过调用rest控制器类

Spring 使用处理程序interptor跳过调用rest控制器类,spring,rest,spring-boot,interceptor,spring-restcontroller,Spring,Rest,Spring Boot,Interceptor,Spring Restcontroller,我已经使用SpringBoot编写了一个小的RESTAPI url- 测试控制器类 Rest控制器类超时 @RestController @范围(“请求”) @请求映射(path=“/api/request”) 公共类ResponseRestController{ @自动连线 RequestHandlerService RequestHandlerService; @交叉起源 @RequestMapping(value=“/timeout”,method=RequestMethod.GET) 公

我已经使用SpringBoot编写了一个小的RESTAPI

url-

测试控制器类 Rest控制器类超时
@RestController
@范围(“请求”)
@请求映射(path=“/api/request”)
公共类ResponseRestController{
@自动连线
RequestHandlerService RequestHandlerService;
@交叉起源
@RequestMapping(value=“/timeout”,method=RequestMethod.GET)
公共响应状态超时(){
ResponseBean ResponseBean=requestHandlerService.HandlerRequestTimeout();
返回新的ResponseEntity(responseBean、HttpStatus.REQUEST\u超时);
}
}
当用户请求超时时,我使用了httpServletResponse.sendRedirect跳过调用/api/testservicerest控制器类

但是它调用/api/testservicerest控制器类,然后调用/api/request/timeoutrest控制器类

当用户请求超时时,我想跳过调用rest控制器类

任何人都可以描述如何解决这个问题。这将非常有帮助。提前感谢

医生说

DispatcherServlet处理执行链中的处理程序, 由任意数量的拦截器组成,处理程序本身位于 结束。使用此方法,每个拦截器都可以决定中止 执行链,通常发送HTTP错误或写入自定义 答复

以及
预处理方法的说明

返回: 如果执行链应继续执行下一个拦截器或处理程序本身,则为true。否则,DispatcherServlet假定 这个拦截器已经处理了响应本身


因此,如果您在拦截器中抛出异常或写入响应并返回false,调用将无法到达实际的处理程序(控制器)。

非常感谢。您的回答有助于我理解内部工作流程。但是我如何停止请求以获得实际的处理程序。我尝试下面的代码。它不起作用。RequestDispatcher RequestDispatcher=httpServletRequest.getRequestDispatcher(“/api/request/timeout”);转发(httpServletRequest,httpServletResponse)<代码>返回false
在预处理中。不能返回false。我必须返回api调用程序的响应正文,说明请求超时。@Shalika您可以直接将响应写入流,然后返回false以跳过进一步的处理。
@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);
    }
}