我一直在试图验证码与建立在Spring框架的我的应用程序集成,但我得到这个错误:reCAPTCHA的问题与Spring MVC的
org.springframework.web.bind.MissingServletRequestParameterException
: Required String parameter 'recaptcha_challenge_field' is not present
有人能帮助我明白为什么我收到此错误。我已将recaptcha_challenge_field
和recaptcha_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>
你能帮我明白我在这里错过了什么吗? 感谢您的回复。
请发布一些与问题相关的代码,例如控制器代码。 – axtavt 2011-02-14 12:14:41