我正在编写基于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对象控制器将以某种方式发现错误并发送所有数据。
开箱外,您需要将错误消息添加到会话中,然后在下一个请求的preHandle或posthhandle方法中,您需要检查会话以查看是否存在错误消息。
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);
}