2017-02-13 12 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() является пустая строка. Во втором, содержимое именно то, что я отправил из своего клиентского приложения.

Отладка, я нашел фильтр с путём описывается как +/*paths, объявленный в классе SparkUtils.

Есть два вопроса:

  1. Как я могу отключить это поведение?
  2. Какова цель фильтра, объявленного как +/*paths?

Я считаю, что причина фильтра вызывается дважды, потому, что я следовал шаги к Enabled CORS, как описано here. Во всяком случае, мне нужно использовать CORS, но фильтр, который вызывается дважды, является проблемой в моем сценарии.

ответ

1

Я не думаю, что вам нужно использовать фильтр. Фильтр используется, когда вам нужно что-то проверять в разных случаях.

В вашем случае вам нужно проверить тело, когда это запрос POST (например, я не знаю,)

Этот фильтр, как вы упомянули, вызывается дважды из-за ВАРИАНТОВ и запроса POST.

Что вы должны сделать, это перевести валидацию на метод, в котором вы получаете запрос. Например, что-то вроде:

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

Другой вариант, если вам действительно нужно держать фильтр, чтобы проверить метод запроса в фильтре, и применить валидацию только POST один, а не OPTIONS один.

+0

Я сделал, как вы предлагаете, проверяя использование 'if (HttpMethod.post.name(). EqualsIgnoreCase (req.requestMethod())). Я не уверен, что он элегантный, но он решает. – josivan

+0

@josivan да, это сработает, но если вы спросите меня, я лично думаю, что это не изящно –

 Смежные вопросы

  • Нет связанных вопросов^_^