Spring MVC动态地忽略或删除请求

时间:2014-04-04 15:19:14

标签: java spring-mvc

作为一个例子,考虑以下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。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用拦截器来完成。

step1:创建一个实现HandlerInterceptor并覆盖其方法的拦截器类。

步骤2:在preHandle()方法内写入你的逻辑以获取复选框值并使用if条件进行检查,如果已检查则从此方法返回true以继续流程,如果未选中则从此方法返回false以停止流动。

让我知道任何问题。