2014-04-04 49 views
0

考虑,作为一个例子,下面的弹簧控制器: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。有任何想法吗?

+0

除了等待无所事事之外,我没有看到很多方法来执行超时。 – Thomas

回答

0

可以使用拦截器做到这一点。

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

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

让我知道的任何问题。

+0

谢谢,但它不会超时。我得到了200OK的回应。我将在上面编辑我的帖子以提供更多细节。 – artvandelay

+0

我正在使用拦截器只处理公共站点请求,但拦截器阻止css的东西加载,它假定css路径为请求。如何处理preHandle()方法? –