복붙노트

[SPRING] GET 리디렉션에서 SessionAttributes가 지워지는 이유는 무엇입니까?

SPRING

GET 리디렉션에서 SessionAttributes가 지워지는 이유는 무엇입니까?

간단하게하기 위해 이러한 코드 스 니펫이 짧아집니다. 이 목적은 GET 매개 변수를 사용하여 세션에서 설정하고 url 매개 변수가 제거 된 GET으로 다시 리디렉션하는 것입니다. 기본적으로 URI 정리. 이렇게하는 것이 더 좋고 / 더 쉬운 방법이 있다면, 나는 그것을 듣게되어 기쁠 것입니다.

나는 컨트롤러를 다음과 같이 정의했다 :

@Controller
@RequestMapping("/path/page.xhtml")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@SessionAttributes({ "myParam1", "myParam2" })
public class MyController {

  @RequestMapping(method = RequestMethod.GET, params = { "urlParam2" })
  public String handleUriParam(@RequestParam(value = "urlParam2", required = false)
                               final Long urlParam2,
                               final RedirectAttributes redirs) {
    // at this point, myParam1 is set on the session.
    // now set the param as a flash attrib with the name of the session variable
    redirs.addFlashAttribute("myParam2", urlParam2);
    return "redirect:/path/page.xhtml";
  }

  @RequestMapping(method = RequestMethod.GET, params = {})
  public String doGetStuff(ModelMap model) {
    // do stuff using myParam1 and myParam2.
    // problem is, myParam2 is on the session, but myParam1 is not!
  }

}

코드가 말했듯이, 어떻게 든 myParam1은 리다이렉트 (redirect)가 발생하면 설정이 해제됩니다. ModelMap을 handleUrlParam 메서드에 전달하고 myParam1을 플래시 속성에 수동으로 추가하여이 문제를 해결할 수 있습니다.하지만 내 마음 속의 목적을 무력화시키는 것 같습니다.

리디렉션 후에 SessionAttribute myParam1이 제거되는 이유는 무엇입니까?

URI에서 매개 변수를 가져 와서 세션에 넣는 더 좋은 방법이 있습니까?

최신 정보

따라서 RedirectAttributes를 사용할 때마다 FlashAttributes의 리디렉션에 넣을 SessionAttributes를 넣어야합니다. 그렇지 않으면 손실 될 수 있습니다. SessionAttributes가 ModelMap (FlashAttributes가 사용될 때 대체 됨)에서 분리되기 때문에 이런 일이 일어난다 고 상상해보십시오. 이것은 봄이나 의도적 인 행동의 버그입니까? 의도적 인 경우 다른 사람이 이유를 설명 할 수 있습니까? 나는 SessionAttributes가 대화 세션이 끝날 때까지 계속 머물러야한다고 생각했다.

비슷한 StackOverflow 게시물을 여기에.

추가

제공된 대답에 비추어 볼 때 URI 매개 변수를 지우는 동안 사용자 세션에서 URI 매개 변수를 지울 수있는 방법이 여전히 부족합니다. 내가 생각한 한 가지 옵션은 URI 원시 문자열에 배치되지 않기 때문에 저장하려고하는 세미 원시적 객체 (java.lang.Integer, java.lang.String)에 대한 래퍼를 만드는 것입니다. 그러나 이것은 해킹 된 것 같습니다. 나를. 누구든지 GET 매개 변수를 받아들이고이를 사용자 세션에 저장하고 사용자의 주소 표시 줄에서 해당 매개 변수를 지우는 더 좋은 방법이있는 경우 (리디렉션이 필요함) 기꺼이 사용합니다.

해결법

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

    1.그래서 코드와 인터넷에서 왜 작동하지 않는지 알아 보려고했습니다.

    그래서 코드와 인터넷에서 왜 작동하지 않는지 알아 보려고했습니다.

    Spring은 완전히 다른 두 개의 모델 맵을 가지고 있는데 하나는 표준 뷰 렌더링 용이고 다른 하나는 리다이렉트가 발행 될 때이다. 이는 ModelAndViewContainer에서 볼 수 있습니다.

    이제 세션 속성 지속성은 mavContainer # getModel ()의 결과를 기반으로 수행됩니다. 리디렉션 시나리오의 경우 리디렉션 모델을 반환합니다. 따라서 표준 Model / ModelMap에서 설정 한 것은 모두 손실됩니다.

    이것은 표준 모델 속성에 대해 말할 때 의미가 있습니다. 모델은 주로 객체를 뷰에 전달합니다. 리디렉션을 사용할 때 완전히 다른 상황을 다루고 있습니다. HTTP 리디렉션을 통해 객체를 전송하려고하므로 분리 된 문자열과 플래시 기반 모델이 필요합니다.

    그러나 내 감정은이 기능을 디자인 할 때 세션 속성을 잊었다는 것입니다. Spring Jira에는 몇 가지 좋은 토론이 있지만,이 중 특정 문제를 다루는 사람은 없습니다.

    그래서 예 ... 이것은 Spring의 Jira에 대한 주제 일 수 있습니다. 그리고 이것은 리디렉션을 사용할 때 누군가가 세션 모델 속성을 설정하는 것을 방지하기 때문에 버그로 분류 될 수 있습니다. RedirectAttributes # addFlashAttribute를 통해 세션 속성을 Spring에 저장하도록 강요하는 것은 IMO 자체적으로 해킹 및 종류의 버그입니다.

  2. from https://stackoverflow.com/questions/17086216/why-do-sessionattributes-get-cleared-on-get-redirect by cc-by-sa and MIT license