2011-03-21 5 views
1

스프링 3 MVC 형식의 유효성을 검사하고 싶습니다. 요소가 유효하지 않은 경우 유효성 검사 메시지를 사용하여 양식을 다시 표시하려고합니다. 지금까지 꽤 간단합니다. 마찰은 사용자가 잘못된 제출 후에 새로 고침을 누르면 게시를 원하지 않고 가져 오기를 원합니다. 이는 POST (제출) 양식에서 재 지정을 수행하여 유효성 검증 메시지 (양식이 POST를 통해 제출 됨)로 양식을 다시 표시해야 함을의 L합니다.봄 MVC 유효성 검사 - POST 백 방지

이 작업을 수행하는 가장 좋은 방법은 SessionAttributeStore.retrieveAttribute를 사용하여 양식이 이미 사용자 세션에 있는지 테스트하는 것입니다. 이 경우 상점 양식을 사용하십시오. 그렇지 않으면 새 양식을 작성하십시오.

소리가 나나요? 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

1

를 해결하기 위해 이 문제는 POST에서 리디렉션 한 후에 세션에 Errors 객체를 저장합니다. 그런 다음 GET에서 모델에 다시 넣습니다. 여기에 구멍이 있지만 99.999 %의 시간 동안 작동합니다.

public class ErrorsRedirectInterceptor extends HandlerInterceptorAdapter { 
    private final static Logger log = Logger.getLogger(ErrorsRedirectInterceptor.class); 

    private final static String ERRORS_MAP_KEY = ErrorsRedirectInterceptor.class.getName() 
      + "-errorsMapKey"; 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
      Object handler, ModelAndView mav) 
     throws Exception 
    { 
     if (mav == null) { return; } 

     if (request.getMethod().equalsIgnoreCase(HttpMethod.POST.toString())) { 
      // POST 
      if (log.isDebugEnabled()) { log.debug("Processing POST request"); } 
      if (SpringUtils.isRedirect(mav)) { 
       Map<String, Errors> sessionErrorsMap = new HashMap<String, Errors>(); 
       // If there are any Errors in the model, store them in the session 
       for (Map.Entry<String, Object> entry : mav.getModel().entrySet()) { 
        Object obj = entry.getValue(); 
        if (obj instanceof Errors) { 
         if (log.isDebugEnabled()) { log.debug("Adding errors to session errors map"); } 
         Errors errors = (Errors) obj; 
         sessionErrorsMap.put(entry.getKey(), errors); 
        } 
       } 
       if (!sessionErrorsMap.isEmpty()) { 
        request.getSession().setAttribute(ERRORS_MAP_KEY, sessionErrorsMap); 
       } 
      } 
     } else if (request.getMethod().equalsIgnoreCase(HttpMethod.GET.toString())) { 
      // GET 
      if (log.isDebugEnabled()) { log.debug("Processing GET request"); } 
      Map<String, Errors> sessionErrorsMap = 
        (Map<String, Errors>) request.getSession().getAttribute(ERRORS_MAP_KEY); 
      if (sessionErrorsMap != null) { 
       if (log.isDebugEnabled()) { log.debug("Adding all session errors to model"); } 
       mav.addAllObjects(sessionErrorsMap); 
       request.getSession().removeAttribute(ERRORS_MAP_KEY); 
      } 
     } 
    } 
} 
0

질문에서 분명하지 않지만 GET 및 POST 동작이 동일한 처리기에 매핑 된 것처럼 들립니다. 이 경우 다음과 같이 할 수 있습니다.

if ("POST".equalsIgnoreCase(request.getMethod())) { 
    // validate form 
    model.addAttribute(form); 
    return "redirect:/me.html"; 
} 
model.addAttribute(new MyForm()); 
return "/me.html"; 

JSP에서 양식 및 표시에 오류가 있는지 확인합니다.

+0

아니요, GET 및 POST에 대해 다른 방법을 사용할 계획입니다. 제 질문은 명확하지 않아야합니다. 나는 그것을 편집 할 것이다. –

0

이러한 접근 방식은 내가 대답의 하나로서 몇 일 전에 그것을 설명 PRG (POST/리디렉션/GET) 디자인 패턴이라고 :

Spring MVC Simple Redirect Controller Example

는 희망이 도움 :)

+0

죄송합니다, 이것은 내가 찾고있는 것이 아닙니다. 귀하의 예는 표준 양식 제출에 적합합니다. 사용자에게 다시 표시되는 잘못된 양식을보고 있습니다. 사용자가 새로 고침을 누를 때 POST를하지 않으려 고합니다. –