[SPRING] GET 리디렉션에서 SessionAttributes가 지워지는 이유는 무엇입니까?
SPRINGGET 리디렉션에서 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.그래서 코드와 인터넷에서 왜 작동하지 않는지 알아 보려고했습니다.
그래서 코드와 인터넷에서 왜 작동하지 않는지 알아 보려고했습니다.
Spring은 완전히 다른 두 개의 모델 맵을 가지고 있는데 하나는 표준 뷰 렌더링 용이고 다른 하나는 리다이렉트가 발행 될 때이다. 이는 ModelAndViewContainer에서 볼 수 있습니다.
이제 세션 속성 지속성은 mavContainer # getModel ()의 결과를 기반으로 수행됩니다. 리디렉션 시나리오의 경우 리디렉션 모델을 반환합니다. 따라서 표준 Model / ModelMap에서 설정 한 것은 모두 손실됩니다.
이것은 표준 모델 속성에 대해 말할 때 의미가 있습니다. 모델은 주로 객체를 뷰에 전달합니다. 리디렉션을 사용할 때 완전히 다른 상황을 다루고 있습니다. HTTP 리디렉션을 통해 객체를 전송하려고하므로 분리 된 문자열과 플래시 기반 모델이 필요합니다.
그러나 내 감정은이 기능을 디자인 할 때 세션 속성을 잊었다는 것입니다. Spring Jira에는 몇 가지 좋은 토론이 있지만,이 중 특정 문제를 다루는 사람은 없습니다.
그래서 예 ... 이것은 Spring의 Jira에 대한 주제 일 수 있습니다. 그리고 이것은 리디렉션을 사용할 때 누군가가 세션 모델 속성을 설정하는 것을 방지하기 때문에 버그로 분류 될 수 있습니다. RedirectAttributes # addFlashAttribute를 통해 세션 속성을 Spring에 저장하도록 강요하는 것은 IMO 자체적으로 해킹 및 종류의 버그입니다.
from https://stackoverflow.com/questions/17086216/why-do-sessionattributes-get-cleared-on-get-redirect by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] ItemWriter에 보내기 전에 중복 된 항목을 필터링하는 방법을 일괄 처리하는 방법 (0) | 2019.02.12 |
---|---|
[SPRING] Spring 프로필, 다른 Log4j2 구성 (0) | 2019.02.12 |
[SPRING] 항목 작성기없이 스프링 배치 단계를 작성하는 방법 (0) | 2019.02.11 |
[SPRING] 몇 가지 웹 응용 프로그램간에 보안 컨텍스트 공유 (0) | 2019.02.11 |
[SPRING] 스프링 의존성 주석이 달린 애스펙트 삽입하기 (0) | 2019.02.11 |