通过使用tutorial,我试图在我的游戏项目中应用验证码。

的HTML

<form action="/applyForWork" method="post" enctype="multipart/form-data">
        <input type="text" name="relevant" id="relevant" >
        <input type="file" name="file"/>
        <br/>
        @Html(views.ReCaptcha.render())
        <br/>
        <input type="submit" value="Upload"/>
</form>


控制者

def applyForWork = Action {
    implicit request =>
      println(request.body.asFormUrlEncoded) //None
      Ok("submitted")
  }



  Q1。为什么此println(request.body.asFormUrlEncoded)给出None





  Q2.captcha框显示在我的html中,但如何验证它是正确的
  或不?


我正在使用scala 2.10和play framework 2.2

最佳答案

A1。这样做的原因是表单的enctype。使用multipart / form-data时,可以使用以下方式访问表单数据:

request.body.asMultipartFormData


A2。无论如何,如果您是我,我将坚持您所提到的教程中介绍的解决方案,并为Recaptcha值创建表单映射。

case class CaptchaForm(challenge: String, response: String)

val captchaForm = Form[CaptchaForm](
 mapping(
    "recaptcha_challenge_field" -> nonEmptyText,
    "recaptcha_response_field" -> nonEmptyText
  )(CaptchaForm.apply)(CaptchaForm.unapply)
 )


这样,您可以在需要处理Repatcha的任何地方重用它。

def applyForWork = Action { implicit request =>
  captchaForm.bindFromRequest.fold(
    formWithErrors => BadRequest("Captcha Param Error"),
    captchaForm => {
      println(captchaForm.challenge)
      println(captchaForm.response)
      if (check(request.remoteAddress, captchaForm.challenge, captchaForm.response)) {
        //Captcha ok
      }
    }
  )
}

def check(remoteAddress: String, challenge: String, response: String): Boolean = {
  val reCaptcha = new ReCaptchaImpl()
  reCaptcha.setPrivateKey(privateKey())
  val reCaptchaResponse = reCaptcha.checkAnswer(remoteAddress, challenge, response)
  reCaptchaResponse.isValid()
}


暗示

考虑在模板中使用路由映射,而不要使用硬编码的URL。在这种情况下,请更换

action="/applyForWork"




action="@routes.YourFormController.handleAction()"


如果您将映射更改为路线中的某个操作,则无需更改所有使用该映射的模板。

10-04 18:15