2010-02-06 5 views
20

스프링 3.0에서 메소드 서명에 HttpSession을 포함하지 않고 액세스 할 수있는 방법이 있습니까? 내가 정말로하고 싶은 것은 null 일 수있는 HttpSession에서 값을 전달할 수 있다는 것입니다. 이 같은스프링 MVC 세션 속성 액세스

뭔가 : 대신의

@RequestMapping("/myHomePage") 
public ModelAndView show(UserSecurityContext ctx) {} 

: 예, 당신이 할 수있는

@RequestMapping("/myHomePage") 
public ModelAndView show(HttpSession session) { 
     UserSecurityContext ctx = (UserSecurityContext) session.getAttribute("userSecurityCtx"); 
} 
+1

관련 : http://stackoverflow.com/questions/3621266/how-to-pass-a-session-attribute-as-method-argument-parameter-with-spring-mvc – Bozho

+0

여기에 봄 티켓의 [# SPR- 4452] (https : //jira.springsource.org/찾아보기/SPR-4452). 빠른 해상도를위한 Upvote 티켓. –

답변

25

@uthark에 의해 언급 된 @SessionAttribute 주석이이 작업에 적합하지 않습니다 - 나는 그것이라고 생각 너무,하지만 bit of reading sh OWS, 그렇지 않으면이 주석을 사용하여 표시로

세션 속성 특정 핸들러의 모델이 투명하게 대화 세션에 저장하기, 속성에 해당합니다. 해당 처리기가 처리기가 대화 세션의 완료를 나타내면이 속성이 제거됩니다. 따라서, 특정 핸들러의 대화의 과정에서 세션 일시적으로 에 저장 있어야하는 등의 대화 속성에 대한 이 기능을 사용합니다.

영구 세션 속성의 경우 사용자 인증 개체 대신 전통적인 session.setAttribute 메서드를 사용하십시오. 또는 WebRequest 인터페이스 일반 관리 기능을 사용하는 것이 좋습니다. 즉

@SessionAttribute (요청 속성로 저장 반대) 세션에서 대화 MVC 모델 객체를 저장하기위한 것입니다. 그것은 임의의 세션 속성과 함께 사용하기위한 것이 아닙니다. 세션 속성이 항상있는 경우에만 작동합니다. 이 방법은 보안과 같은 크로스 커팅 문제에 대한

class SecurityContextHolder { 
    public static UserSecurityContext currentSecurityContext() { 
     return (UserSecurityContext) 
      RequestContextHolder.currentRequestAttributes() 
      .getAttribute("userSecurityCtx", RequestAttributes.SCOPE_SESSION)); 
    } 
} 
... 
@RequestMapping("/myHomePage")   
public ModelAndView show() {   
    UserSecurityContext ctx = SecurityContextHolder.currentSecurityContext(); 
} 

입니다 : 내가 다른 대안 잘 모르는 것 같아요

, 나는 당신이이 RequestContextHolder 사용할 수 있습니다 당신이 HttpSession.getAttribute()

+0

사실 @uthark 솔루션의 일부를 사용하여 결국. null 사용자 컨텍스트 개체로 인해 발생하는 예외를 방지하기 위해 ServletFilter를 앞에 놓아서 채워 졌는지 확인합니다. 이 특정 워크 플로에 대해서는이 솔루션을 사용해도 괜찮지 만, 스프링 처리 대신 null 값을 직접 처리 할 수 ​​없다는 것이 이상하게 보입니다. 모두에게 도움과 통찰력을 주셔서 감사합니다. – Mark

+0

@ 마크 : 이상하게 보입니다. – skaffman

+0

@skaffman 문서가 '핸들러'라는 용어 대신에 컨트롤러가 제대로 작동하지 않는 이유가 있습니까? –

5

.

@SessionAttributes("userSecurityContext") 
public class UserSecurityContext { 
} 

@RequestMapping("/myHomePage") 
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) { 
    // code goes here. 
} 

자세한 내용 참조 :

  1. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/SessionAttributes.html

  2. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

+0

응답 해 주셔서 감사합니다. 내 보안 컨텍스트를 처음에 session.putAttribute()로 추가하고 있습니다. 귀하의 코드를 시도 할 때, 컨텍스트 개체는 null입니다. – Mark

+3

죄송합니다. @SessionAttributes ("userSecurityContext")를 컨트롤러에 추가했을 때이 작업이 끝났습니다. 단순히 실제 UserSecurityContext pojo에 추가하는 것은 나를 위해 아무 것도하지 않았습니다. 그러나 특성이 null 인 경우 Spring에서 예외가 발생합니다. 이는 피하려고하는 것입니다. org.springframework.web.HttpSessionRequiredException : 세션 속성 'userSecurityContext'필요 - 세션에서 찾을 수 없음 – Mark

+0

@Mark이 답변이 적절하지 않은 경우, 아래 답변에서 제안하는대로 허용 된 플래그를 이동하거나 제거하십시오. * skaffman *). 많은 사람들이 수용된 대답 만 읽으면서 오해의 소지가 있습니다. (그냥 아래에 귀하의 의견을 읽어 - 귀하의 전화!) –

8

붙어 있다고 생각 컨트롤러 서명을 수정할 필요가 없기 때문에 더 좋습니다.

+0

나도이 솔루션을 좋아합니다. ThreadLocal 패턴과 다소 비슷합니다. 감사! – Mark