2011-09-14 3 views
3

Struts2에서 인터셉터의 개념을보고 있습니다. Struts2에 대한 튜토리얼에서 아래 예제를 보았습니다.Struts 2 인터셉터 내부의 HttpSession에 어떻게 액세스합니까? 해야합니까?

이 예제에서 작성자는 인터셉터를 사용하여 HttpSession에 액세스하여 자격 증명을 확인하고 USER_KEY을 확인합니다.

요격기 자체에서 HttpSession에 액세스하는 것은 좋지 않은가요? 인터셉터는 Java EE 프로그래밍에서 간단한 서블릿 필터라고 생각합니다.

HttpSession에 액세스하는 가장 좋은 장소는 Struts2의 액션 클래스 안에 있다고 느낍니다.

내가 잘못했을 경우를 대비하여 저를 시정하십시오.

public class AuthorizationInterceptor extends AbstractInterceptor { 

    private static final String USER_KEY = "user"; 

    public String intercept(ActionInvocation invocation) throws Exception { 
     Map session = invocation.getInvocationContext().getSession(); 
     if (session.get(USER_KEY) == null) { 
      addActionError(invocation, "You must be authenticated to access this page"); 
      return Action.ERROR; 
     } 

     return invocation.invoke(); 
    } 

    private void addActionError(ActionInvocation invocation, String message) { 
     Object action = invocation.getAction(); 
     if (action instanceof ValidationAware) { 
      ((ValidationAware) action).addActionError(message); 
     } 
    } 
} 
+0

이것은 당신도 도움이 될 수 있습니다 : http://stackoverflow.com/questions/5509606/session-problem-in- struts2-application/5517526 # 5517526 –

답변

5

요격기에서 HttpSession에 액세스하는 것은 완벽합니다. 행동으로 접근하는 것은 적극적으로 권장되지 않습니다.

인터셉터를 통한 액세스 제어는 완벽한 사용 사례입니다. 액세스 제어는 일반적으로 응용 프로그램의 많은 부분에 영향을줍니다. 인터셉터에서 분리하면 주요 코드가 더 깨끗하게 유지됩니다. 인터셉터는 세션과 같은 서블릿 스펙 아티팩트와 인터페이스하기에 가장 적합한 장소입니다.

작업은 부터 SessionAware interface까지의 세션에 액세스 할 수 있습니다. 속성의 Map<String, Object> 만 노출합니다. 이렇게하면 서블릿 사양과 동작이 분리되어 테스트가 더 쉬워집니다.

+0

그래서 당신은 인터셉터 안에서만 세션 액세스 코드를 유지한다고 말하고 싶습니까 ?? – Pawan

+0

아니, 필요하다면 언제든지 세션에 액세스 할 수 있지만 적절하게 수행해야합니다. 대부분의 액션은 세션 속성 만 필요로하기 때문에 [SessionAware'] (http://struts.apache.org/2.x/struts2-core/apidocs/org/apache/struts2/interceptor/SessionAware.html) 구현은 대부분의 세션 대부분의 작업이 필요합니다. 그 인터페이스는 인터셉터에서 의미가 없으므로, 보통'ActionContext'가 방법입니다. –

+0

대단히 감사합니다, Dave Newton. – Pawan

0

당신이 진짜 HttpSession 내부 인터셉터에 액세스하려면하여 취득 할 수 있습니다 :

HttpSession session = ServletActionContext.getRequest().getSession(); 

P.S. 나도 알아, 내 대답은 귀하의 질문에 너무 늦었지만 다른 사람에게 도움이 될 수 있습니다 희망 =)