如何在HandlerInterceptorAdapter中验证发布表单中的某些字段

时间:2011-10-27 13:50:35

标签: java spring-mvc

我正在编写基于HandlerInterceptorAdapter的CaptchaInterceptor。在preHandle方法中,我必须检查capcha值。如何通过此方法添加错误消息并将用户返回到具有无效cactha值的表单,并且不会丢失用户输入的数据?

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
/*  Validate */
String kaptchaExpected = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
String kaptchaReceived = request.getParameter("j_kaptcha");
    if (!StringUtils.endsWithIgnoreCase(kaptchaReceived,kaptchaExpected))
    {
     // add errorMessage
     // reset request values?
     response.sendRedirect(request.getHeader("Referer"));

    return false;
    }
return true;
}

或者添加错误并向处理程序发送请求。在BindingResult中,对象控制器会以某种方式找到错误并将所有数据发回。

1 个答案:

答案 0 :(得分:0)

开箱即用,您需要将错误消息添加到会话中,然后在下一个请求的preHandle或postHandle方法内部,您需要检查会话以查看是否存在错误消息。

public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                       Object handler, ModelAndView modelAndView) {
    //Best to put them in some sort of iterable, so your UI can iterate over them
    Object errorMessages = 
        request.getSession().getAttribute(ERROR_MESSAGES_CONSTANT);

    modelAndView.addObject("errorMessages", errorMessages);
}

在视图内部,您需要处理错误消息(如果存在)。

完成后,您将需要从会话中清除它(因此他们在每个页面上都看不到相同的消息)。

public void postHandle(HttpServletRequest request, HttpServletResponse response,
                       Object handler, ModelAndView modelAndView) {

  request.getSession().setAttribute(ERROR_MESSAGES_CONSTANT, null);
}