考慮,作爲一個例子,下面的彈簧控制器: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