作为一个例子,考虑以下Spring控制器:
@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
到/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。有什么想法吗?
答案 0 :(得分:0)
您可以使用拦截器来完成。
step1:创建一个实现HandlerInterceptor并覆盖其方法的拦截器类。
步骤2:在preHandle()方法内写入你的逻辑以获取复选框值并使用if条件进行检查,如果已检查则从此方法返回true以继续流程,如果未选中则从此方法返回false以停止流动。
让我知道任何问题。