Play Framework 2.5 CSRF检查失败了ajax

时间:2016-08-19 05:26:38

标签: scala playframework playframework-2.0

我不想为我的所有请求启用CSRF过滤器。 但是想以我的形式使用它。 所以我在控制器中使用CSRFAddToken和CSRFCheck:

public class Contact extends RealmObject {
    @PrimaryKey
    private String id;
    private String phoneNumber;
    private String name;

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public String getUserId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public void setUserId(String id) {
        this.id = id;
    }    
}

在视图中我只是使用

  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添加到表单中 然后我使用Ajax获取getCurrent操作并获取表单的html,并在保存时使用Ajax发布它以更改操作。问题是我得到了

  

CSRF令牌检查失败

提交错误。即便如此,我在表格中看到了CSRF隐藏字段。我做错了什么?

1 个答案:

答案 0 :(得分:3)

也许您的JavaScript库无法正确获取csrfToken字段?例如,在使用jQuery' text()代替val()时,您可以拥有issue ...

根据您的配置设置,您可能会遗漏Csrf-Token值。 Play需要头文件(会话)AND中的CSRF令牌(在表单OR查询字符串中)。更多信息here