reCaptcha проблема с Spring MVC - PullRequest
       21

reCaptcha проблема с Spring MVC

0 голосов
/ 14 февраля 2011

Я пытался интегрировать reCaptcha с моим приложением, построенным на платформе Spring, но я получаю эту ошибку:

org.springframework.web.bind.MissingServletRequestParameterException: обязательный параметр строки 'recaptcha_challenge_field' отсутствует

Может кто-нибудь помочь мне понять, почему я получаю эту ошибку.У меня есть и параметры recaptcha_challenge_field и recaptcha_response_field, связанные с доменным объектом User.

Может ли кто-нибудь помочь мне понять, что мне не хватает?

Спасибо

Вот код контроллера, который я использую, все, что я пытаюсь сделать, это зарегистрировать пользователя с функциональностью reCaptcha, но я получаю 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, ", "));
        }
    }
}

Вот элемент addNewUser.jsp на странице формы для вышеуказанного контроллера:

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

Не могли бы вы помочья понимаю, что мне здесь не хватает?Спасибо за ответ.

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Что такое реализация:

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

HTML-код reCaptcha должен иметь атрибут name как "recaptcha_challenge_field"

...

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

...

0 голосов
/ 31 марта 2014

Captcha - динамически загружаемый скрипт на странице.Лучше прочитать параметры капчи из объекта запроса, как показано в следующем примере:

@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");  }
...