2014-04-04 51 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()方法? –