스트럿츠2 - 인터셉터로 세션 로그인 체크
참고 가능한 샘플 주소:
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이란?
출처: http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecStruts&wr_id=157