2017-02-13 55 views
1

我正在映射過濾器以在登錄之前檢查一些必填字段。我的代碼如下所示:Spark在過濾兩次之前運行

before("/login", (req, res) -> { 
    // do some things 
    LOGGER.debug("before /login"); 
    LOGGER.debug("Request -> " + req); 
    LOGGER.degub("body " + req.body()); 
} 

當我的應用程序運行時,before過濾器被調用兩次。

在每一個req是不同的實例。在第一個req.body()的內容是一個空字符串。在第二個中,內容正是我從客戶端應用程序發送的內容。

調試,我發現一個帶路徑的過濾器被描述爲SparkUtils類中聲明的+/*paths

有兩個問題:

  1. 如何禁用這種行爲?
  2. 聲明爲+/*paths的過濾器的用途是什麼?

我相信濾波器因此被稱爲兩次,是因爲我已經按照步驟啓用CORS描述here。無論如何,我需要使用CORS,但是被調用兩次的過濾器在我的場景中是一個問題。

回答

1

我不認爲你需要使用過濾器。當你需要檢查一些東西時,使用過濾器,在不同的情況下。

在你的情況,你需要檢查身體何時是POST請求(例如,我不知道你的情況究竟是什麼)

正如您所提到的那樣,該過濾器由於OPTIONS和POST請求而被調用兩次。

你應該做的是將驗證移到接收請求的方法。例如像:

Spark.post("/login", (req, res) -> { 
    // validate.. 
    // do action.. 
}); 

另一種選擇,如果你真的需要保留的過濾器,是檢查請求方法的過濾器,並應用驗證,只是POST一個,而不是一個選項。

+0

我按照你的建議做了,檢查使用if(HttpMethod.post.name()。equalsIgnoreCase(req.requestMethod()))''。我不確定它是否優雅,但可以解決。 – josivan

+0

@ josivan是的,它會工作,但如果你問我,我個人認爲它不是優雅的 –

相關問題