2011-02-14 176 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"); }