考虑,作为一个例子,下面的弹簧控制器:Spring MVC的动态忽略或下降请求
@Controller
public class MyController {
private boolean dropRequest = false;
/* Any GET requests to /timeout?dropRequest=true (or false)
* will set the dropRequest field
*/
@RequestMapping(value = "/timeout", method = RequestMethod.GET)
@ResponseBody
public void responseTimeout(@RequestParam(value = "dropRequest", required = true, defaultValue = "false") final boolean dropRequest) {
this.dropRequest = dropRequest;
}
/* Perform or ignore a request depending on value of 'dropRequest' */
@RequestMapping(value = "/updatedata", method = RequestMethod.POST)
@ResponseBody
public UpdatedDataObj requestUpdate(@RequestBody final String data) {
if (this.dropRequest) {
// drop/ignore request (do nothing, let it timeout, don't send a 404 or 500)
} else {
// process request as normal
}
}
}
我有一个网页与一个复选框其中,选中时,发送一个GET
到/timeout
如上。这将dropRequest
字段设置为true。我现在想的任何后续POST
s到/updatedata
被丢弃/忽略。我不想要500/404响应,我希望客户端超时等待响应。我想知道如何在Spring MVC中实现这一点?我在这方面进行了一些探索,我发现有一种方法可以实现拦截器?这会起作用吗?我不喜欢在返回控制器强制超时之前放入sleep(N)
的想法。
编辑:我施加的拦截如下建议。当我预计它会超时时,我收到来自请求的200 OK响应。
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
String methodName = hm.getMethod().getName();
if (methodName.equals("requestUpdate")) {
Object obj = hm.getBean();
if (obj instanceof MyController) {
MyController controller = (MyController) obj;
/* I added responsesDisabled() method to controller
* to return the boolean disabled field
*/
return !controller.responsesDisabled();
}
}
}
return true;
}
}
我添加了以下到XML:
<mvc:interceptors>
<bean class="com.blah.interceptors.TestInterceptor" />
</mvc:interceptors>
所以,如果我POST
到/requestUpdate
执行preHandle()
方法如预期。但是,这不会超时。我收到一个空的200 OK。有任何想法吗?
除了等待无所事事之外,我没有看到很多方法来执行超时。 – Thomas