ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스트럿츠2 - 인터셉터로 세션 로그인 체크
    웹프로그래밍/struts 2018. 5. 30. 12:18


    참고 가능한 샘플 주소:
    http://sandeepbhardwaj.github.io/2010/12/01/struts2-with-login-interceptor.html



    -인터셉터 클래스로 세션의 로그인 정보를 확인하는 이유


    일반적인 사용자 외에 직접 주소를 쳐서 접근 하는 사용자를 방지하기 위하여

    매번 해당되는 요청시 마다 login검사를 해줘야 하는 경우가 있다.

     

    액션이 실행되기전 인터셉터로 세션의 아이디가 저장되어 있는지 확인하고

    저장 안되어있을 경우 로그인 페이지로 보낸다.



    1. 로그인 처리 액션에서 아이디를 세션에 저장한다.


    public String execute() throws Exception {

    //사용자에게 입력 받은 정보와 같은 값이 DB 안에 존재하는지 확인한다.

    memberResult = (memVO)sqlMapper.queryForObject("memSQL.loginPro", memberParam);

    if(memberResult != null) {

    sessionMap.put("m_id", memberResult.getM_id());

    sessionMap.put("admin_yn", String.valueOf(memberResult.getAdmin_yn()));

    }

    return SUCCESS;

    }




    2. 인터셉터 클래스 생성



    package mem;


    import java.util.Map;



    import com.opensymphony.xwork2.ActionInvocation;

    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;


    public class LoginCheckInterceptor extends AbstractInterceptor{


    @Override

    public String intercept(ActionInvocation invocation) throws Exception {

    // TODO Auto-generated method stub

    Map<String, Object> session = invocation.getInvocationContext().getSession();

    String m_id = (String)session.get("m_id");

    if(m_id == null) {

    return "gologin";

    }

    return invocation.invoke();

    }

    }



    3.인터셉터 클래스에서 리턴한 result 값을 받는 global-result 태그와 인터셉터 클래스를 매핑하는 코드를 struts2.xml 파일에 작성


    ※액션 맵핑이 포함된 xml 파일의 package 태그 안에 아래코드를 삽입

    <interceptors>
     <interceptor name="login" class="my.LoginInterceptor" />
    
     <interceptor-stack name="stack-with-login">
      <interceptor-ref name="login"/>
      <interceptor-ref name="defaultStack"/>
     </interceptor-stack>
    </interceptors>
    <!-- 모든 액션 태그에 기본 인터셉터로 설정 -->
    <default-interceptor-ref name="stack-with-login"/>

    <!-- 액션 클래스에서 "gologin"을 리턴하면 global-result 태그가 받는다. -->

    <global-results>
           <result name="gologin" type="tiles">loginForm</result>
    </global-results>
    	


    ※특정 액션만 동작하길 원할 경우 아래코드를 해당 액션 태그에 추가

    <interceptor-stack name="stack-with-login">


    ※인터셉터 실행을 원치하는 액션 태그에는 아래코드를 추가

    <interceptor-ref name="defaultStack"/>



    출처: https://stackoverflow.com/questions/2999829/redirect-to-another-action-in-an-interceptor-in-struts-2






    -interceptor-stack이란?


    일반적인 웹 응용 프로그램에서 여러 개의 인터셉터들을 Action에 적용하게 되는데 각 Action마다 인터셉터 리스트를 반복해서 지정한다면 불편할 것이다이렇게 자주 사용되는 인터셉터 리스트를 모아서 지정한 것을 interceptor stack이라고 한다물론 interceptor-stack 내에 다른 interceptor-stack을 포함하는 것도 가능하다.

     

    <interceptor-stack>안에 <interceptor-ref>를 사용해서 인터셉터를 지정한다.

     

    <!-- Basic stack -->

                <interceptor-stack name="basicStack">

                    <interceptor-ref name="exception"/>

                    <interceptor-ref name="servletConfig"/>

                    <interceptor-ref name="prepare"/>

                    <interceptor-ref name="checkbox"/>

                    <interceptor-ref name="params"/>

                    <interceptor-ref name="conversionError"/>

                </interceptor-stack>

     

    위에서 정의한 interceptor-stack name action Tag안에서 참조하면 된다.


    출처: http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecStruts&wr_id=157