2011-02-14 43 views
0

我一直在試圖驗證碼與建立在Spring框架的我的應用程序集成,但我得到這個錯誤:reCAPTCHA的問題與Spring MVC的

org.springframework.web.bind.MissingServletRequestParameterException : Required String parameter 'recaptcha_challenge_field' is not present

有人能幫助我明白爲什麼我收到此錯誤。我已將recaptcha_challenge_fieldrecaptcha_response_field參數綁定到User域對象。

有人能幫我理解我錯過了什麼嗎?

感謝

這裏是我使用控制器的代碼,所有我試圖做的是註冊用戶與驗證碼的功能,但我所得到的是一個http status 400與錯誤org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'recaptcha_challenge_field' is not present

UserManagementController.java

@Controller 
public class UserManagementController { 
    private static final String RECAPTCHA_HTML = "reCaptchaHtml"; 

    @Autowired 
    private UserService userService; 

    @Autowired 
    private ReCaptcha reCaptcha; 

    @RequestMapping(method=RequestMethod.GET, value="/addNewUser.do") 
    public ModelAndView addNewUser() { 
     User user = new User(); 
     String html = reCaptcha.createRecaptchaHtml(null, null); 

     ModelMap modelMap = new ModelMap(); 
     modelMap.put("user", user); 
     modelMap.put(RECAPTCHA_HTML, html); 

     return new ModelAndView("/addNewUser", modelMap); 
    } 

    @RequestMapping(method=RequestMethod.POST, value="/addNewUser.do") 
    public String addNewUser(@Valid User user, BindingResult result,            
               @RequestParam("recaptcha_challenge_field") String challenge, 
               @RequestParam("recaptcha_response_field") String response, 
               HttpServletRequest request,            
               Model model) { 

     verifyBinding(result); 
     String remoteAddr = request.getRemoteAddr(); 
     ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, response); 
     if (!reCaptchaResponse.isValid()) { 
      result.rejectValue("captcha", "errors.badCaptcha"); 
      } 

     model.addAttribute("user", user); 
     if (result.hasErrors()) { 
      result.reject("form.problems"); 
      return "addNewUser"; 
     } 
     return "redirect:showContent.do"; 
    } 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.setAllowedFields(new String[] { 
      "firstName", "lastName", "email", 
      "username", "password", "recaptcha_challenge_field", "recaptcha_response_field" 
     }); 
    } 

    private void verifyBinding(BindingResult result) { 
     String[] suppressedFields = result.getSuppressedFields(); 
     if (suppressedFields.length > 0) { 
      throw new RuntimeException("You've attempted to bind fields that haven't been allowed in initBinder(): " 
        + StringUtils.join(suppressedFields, ", ")); 
     } 
    } 
} 

這裏是關於FO的addNewUser.jsp元件上述控制器的rm頁面:

 <tr> 
      <td>Please prove you're a person</td> 
      <td>${reCaptchaHtml}</td> 
      <td><form:errors path="captcha" cssStyle="color:red"></form:errors></td> 
     </tr> 

你能幫我明白我在這裏錯過了什麼嗎? 感謝您的回覆。

+0

請發佈一些與問題相關的代碼,例如控制器代碼。 – axtavt 2011-02-14 12:14:41

回答

1

什麼是執行:

String html = reCaptcha.createRecaptchaHtml(null, null); ? 

的ReCaptcha HTML必須具有name屬性爲 「recaptcha_challenge_field」

...

<textarea name="recaptcha_challenge_field" ... /> 
<input type="hidden" name="recaptcha_response_field" value="manual_challenge" /> 

...

0

驗證碼是頁面上動態加載的腳本。最好從請求對象讀取驗證碼參數,如下例所示:

@RequestMapping(value="/submitCaptcha.web",method = RequestMethod.POST) 
public String submitCaptcha(@ModelAttribute("recaptchaBean") RecaptchaBean recaptchaBean,BindingResult result, ModelMap model, HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 

    String captchaChallenge = request.getParameter("recaptcha_challenge_field"); 
    String captchaText = request.getParameter("recaptcha_response_field"); }