我一直在試圖驗證碼與建立在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