복붙노트

[SPRING] Spring - POST 후에 리디렉션 (유효성 검사 오류가있는 경우에도)

SPRING

Spring - POST 후에 리디렉션 (유효성 검사 오류가있는 경우에도)

BindingResult를 "보존"하는 방법을 알아 내려고 노력 중이므로 Spring

태그를 통해 후속 GET에서 사용할 수 있습니다. 그 이유는 Google App Engine의 SSL 제한 때문입니다. HTTP를 통해 표시되는 양식이 있고 해당 게시물은 HTTPS URL에 있습니다. 리디렉션이 아닌 전달 만하는 경우 사용자는 https://whatever.appspot.com/my/form URL을 볼 수 있습니다. 나는 이것을 피하려고 노력하고있다. 어떤 아이디어가 이것에 접근하는 방법?

아래는 내가하고 싶은 것이지만, "create"return을 사용할 때만 유효성 검사 오류를 볼 수 있습니다.

@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(
    @ModelAttribute("register") @Valid final Register register,
    final BindingResult binding) {

    if (binding.hasErrors()) {
        return "redirect:/register/create";
    }

    return "redirect:/register/success";
}

해결법

  1. ==============================

    1.Spring 3.1부터 RedirectAttributes를 사용할 수있다. 리디렉션을 수행하기 전에 사용 가능하게 할 속성을 추가하십시오. 유효성을 검사하는 데 사용하는 BindingResult 및 개체 (이 경우 Register)를 모두 추가하십시오.

    Spring 3.1부터 RedirectAttributes를 사용할 수있다. 리디렉션을 수행하기 전에 사용 가능하게 할 속성을 추가하십시오. 유효성을 검사하는 데 사용하는 BindingResult 및 개체 (이 경우 Register)를 모두 추가하십시오.

    BindingResult의 경우 "org.springframework.validation.BindingResult. [name of your ModelAttribute]"라는 이름을 사용합니다.

    유효성을 검사하는 데 사용하는 개체의 경우 ModelAttribute라는 이름을 사용합니다.

    RedirectAttributes를 사용하려면 설정 파일에 추가해야합니다. 다른 것들 중에는 몇 가지 새로운 클래스를 사용하도록 Spring에 알려주는 경우가 있습니다.

    <mvc:annotation-driven />
    

    이제 리디렉션 할 때마다 오류가 표시됩니다.

    @RequestMapping(value = "/submit", method = RequestMethod.POST)
    public final String submit(@ModelAttribute("register") @Valid final Register register, final BindingResult binding, RedirectAttributes attr, HttpSession session) {
    
    if (binding.hasErrors()) {
        attr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
        attr.addFlashAttribute("register", register);
        return "redirect:/register/create";
    }
    
    return "redirect:/register/success";
    }
    
  2. ==============================

    2.Oscar의 멋진 답변 외에도 RedirectAttributes 접근 방식을 따르고 있다면 실제로 modelAttribute를 리디렉션 된 페이지로 전달한다는 사실을 잊지 마십시오. 즉, 컨트롤러에서 리디렉션 된 페이지에 대한 해당 modelAttribute의 새 인스턴스를 만드는 경우 유효성 검사 오류가 손실됩니다. 그래서 POST 컨트롤러 메소드가 다음과 같은 경우 :

    Oscar의 멋진 답변 외에도 RedirectAttributes 접근 방식을 따르고 있다면 실제로 modelAttribute를 리디렉션 된 페이지로 전달한다는 사실을 잊지 마십시오. 즉, 컨트롤러에서 리디렉션 된 페이지에 대한 해당 modelAttribute의 새 인스턴스를 만드는 경우 유효성 검사 오류가 손실됩니다. 그래서 POST 컨트롤러 메소드가 다음과 같은 경우 :

    @RequestMapping(value = "/submit", method = RequestMethod.POST)
    public final String submit(@ModelAttribute("register") @Valid final Register register, final BindingResult binding, RedirectAttributes attr, HttpSession session) {
    
    if (binding.hasErrors()) {
        attr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
        attr.addFlashAttribute("register", register);
        return "redirect:/register/create";
    }
    
    return "redirect:/register/success";
    }
    

    그런 다음 등록 페이지 생성 GET 컨트롤러에서 수정해야 할 것입니다. 이것으로부터:

    @RequestMapping(value = "/register/create", method = RequestMethod.GET)
    public String registerCreatePage(Model model) {
        // some stuff
        model.addAttribute("register", new Register());
        // some more stuff
    }
    

    @RequestMapping(value = "/register/create", method = RequestMethod.GET)
    public String registerCreatePage(Model model) {
        // some stuff
        if (!model.containsAttribute("register")) {
            model.addAttribute("register", new Register());
        }
        // some more stuff
    }
    

    출처 : http://gerrydevstory.com/2013/07/11/preserving-validation-error-messages-on-spring-mvc-form-post-redirect-get/

  3. ==============================

    3.문제는 뷰를 렌더링하고 처리 된 폼 페이지를 반환하는 대신 새 컨트롤러로 리디렉션하는 것입니다. 다음 행을 따라 뭔가를해야합니다.

    문제는 뷰를 렌더링하고 처리 된 폼 페이지를 반환하는 대신 새 컨트롤러로 리디렉션하는 것입니다. 다음 행을 따라 뭔가를해야합니다.

    String FORM_VIEW = wherever_your_form_page_resides
    
    ...
    
    if (binding.hasErrors())
        return FORM_VIEW;
    

    문자열의 코드 중복으로 인해 메서드 외부에 경로를 유지합니다.

  4. ==============================

    4.요청간에 객체를 지속시키는 유일한 방법 (즉, 리디렉션)은 객체를 세션 속성에 저장하는 것입니다. 따라서 두 메소드 (get 및 post)의 메소드 매개 변수에 "HttpServletRequest request"를 포함시키고 request.getAttribute ( "binding")를 통해 객체를 검색합니다. 즉, 직접 시도하지 않고 새 요청에서 바인딩을 개체에 다시 바인딩하는 방법을 찾아야 할 수도 있습니다.

    요청간에 객체를 지속시키는 유일한 방법 (즉, 리디렉션)은 객체를 세션 속성에 저장하는 것입니다. 따라서 두 메소드 (get 및 post)의 메소드 매개 변수에 "HttpServletRequest request"를 포함시키고 request.getAttribute ( "binding")를 통해 객체를 검색합니다. 즉, 직접 시도하지 않고 새 요청에서 바인딩을 개체에 다시 바인딩하는 방법을 찾아야 할 수도 있습니다.

    또 다른 "좋지 않은"방법은 javascript를 사용하여 브라우저 URL을 변경하는 것입니다.

  5. ==============================

    5.왜 리디렉션이 필요한지 질문 할 것입니다. 왜 똑같은 URL에 제출하고 POST와 다르게 반응하지 않는가? 그럼에도 불구하고 정말로 이것을하고 싶다면 :

    왜 리디렉션이 필요한지 질문 할 것입니다. 왜 똑같은 URL에 제출하고 POST와 다르게 반응하지 않는가? 그럼에도 불구하고 정말로 이것을하고 싶다면 :

    @RequestMapping(value = "/submit", method = RequestMethod.POST)
    public final String submit(
        @ModelAttribute("register") @Valid final Register register,
        final BindingResult binding,
        HttpSession session) {
    
        if (binding.hasErrors()) {
            session.setAttribute("register",register);
            session.setAttribute("binding",binding);
            return "redirect:/register/create";
        }
    
        return "redirect:/register/success";
    }
    

    그런 다음 "만들기"방법 :

    model.put("register",session.getAttribute("register"));
    model.put("org.springframework.validation.BindingResult.register",session.getAttribute("register"));
    
  6. ==============================

    6.Google App Engine의 정확한 문제를 알지 못하지만 ForwardedHeaderFilter를 사용하면 클라이언트가 사용한 원래 구성표를 유지하는 데 도움이 될 수 있습니다. 이 필터는 Spring Framework 4.3에서 추가되었지만 일부 서블릿 컨테이너는 유사한 필터를 제공하며 필터는 자동으로 필요하므로 필요할 경우 소스를 가져올 수 있습니다.

    Google App Engine의 정확한 문제를 알지 못하지만 ForwardedHeaderFilter를 사용하면 클라이언트가 사용한 원래 구성표를 유지하는 데 도움이 될 수 있습니다. 이 필터는 Spring Framework 4.3에서 추가되었지만 일부 서블릿 컨테이너는 유사한 필터를 제공하며 필터는 자동으로 필요하므로 필요할 경우 소스를 가져올 수 있습니다.

  7. ==============================

    7.아마도 이것은 조금 단순하지만, 모델에 추가하려고 했습니까? 즉, 메서드의 인수에 Model을 포함시킨 다음 BindingResult를 추가하면 해당 뷰에서 사용할 수 있습니다.

    아마도 이것은 조금 단순하지만, 모델에 추가하려고 했습니까? 즉, 메서드의 인수에 Model을 포함시킨 다음 BindingResult를 추가하면 해당 뷰에서 사용할 수 있습니다.

    model.addAttribute("binding",binding);
    

    리다이렉트보다는 포워드를 사용해야 할 것 같아요. (리디렉션이 세션을 잃어 버렸는지 기억이 안나네요 .- 문서가 없기 때문에 잘못 될 수 있습니다. if BindingResult를 Model에 추가 한 후에 BindingResult를 얻지 못하면 대신이를 사용하여 전달을 확인하십시오.

  8. from https://stackoverflow.com/questions/2543797/spring-redirect-after-post-even-with-validation-errors by cc-by-sa and MIT license