2016-08-19 7 views
0

Я не хочу включать фильтр CSRF для всех моих запросов. Но хочу использовать его в моей форме. Поэтому я использую CSRFAddToken и CSRFCheck, как это в контроллере:Play Framework 2.5 CSRF check failed ajax

def change(lng: String) = checkToken { 
     Action { implicit request => 
      registerForm.bindFromRequest.fold(
      { formWithErrors => 
       Ok(Json.toJson(JsObject(Map("status" -> JsString("error"), "message" -> JsString(messagesApi.translate("register.all_fields_required", Seq()).get))))) 
      }, 
      value => 
       [Code was cutted] 
     ) 
     } 
    } 

    def getCurrent(lng: String) = addToken { 
    Action { implicit request => 
     Ok(views.html.profile_edit_popup()) 
    } 
    } 

В связи я просто использовать

@CSRF.formField 

добавить CSRF, чтобы сформировать Тогда я получаю действие getCurrent с помощью Ajax и получать HTML для формы и on save Я отправляю его с помощью Ajax для изменения действия. Проблема я получаю

CSRF маркер проверки не удалось

ошибку на кнопку. Тем не менее, я вижу скрытое поле CSRF в форме. Что я делаю неправильно?

+0

Возможно, ваш jQuery или что-то другое не подбирает поле 'csrfToken' правильно? –

+0

Вам также нужно установить заголовок 'Csrf-Token'! См. [Этот пример] (https://github.com/mohiva/play-silhouette-angular-seed/blob/9008dd9a93ff7fcfcfba8c182903b0a997beb034/ui/app/scripts/app.js#L62). Обратите внимание, что токен CSRF отправляется как пользовательское Cookie (см. Приложение.conf). –

+0

@ insan-e ты был прав. Можете ли вы дать ему ответ? – user2975535

ответ

3

Возможно, ваша библиотека в JavaScript не подходит для правильного заполнения поля? csrfToken? Например, вы могли бы issue при использовании text() JQuery, вместо того чтобы val() ...

В зависимости от параметров конфигурации, можно упустить Csrf-Token значение. Play хочет токен CSRF в заголовках (сеансе) AND (в форме или строке запроса). Больше информации here.