본문 바로가기

Java For All

struts2 request response 객체 및 로그인 session 체크

 

1. request, response 객체 구하기

 

몇 가지 방식이 있다고 하는데, 여기서는 ServletRequestAware, ServletResponseAware 인터페이스를 상속하는 방법입니다.

1. 인터페이스의 구현
 
해당 액션에서 직접 구현해도 좋고, 아니면 각 인터페이스를 구현한 클래스를 구현한 뒤 상속하는 것도 좋다.
다만 구현하는 클래스에 HttpServletRequest와 HttpServletResponse 변수를 선언한 뒤 각 인터페이스의 추상메서드를 구현해야 한다. 
여기서는 따로 구현한 클래스를 만든 뒤 상속받아서 사용한다.

# 구현한 클래스
public class BaseActionSupport extends ActionSupport implements ServletRequestAware, ServletResponseAware{
HttpServletRequest request;
HttpServletResponse response;
@Override
public void setServletRequest(HttpServletRequest request){
this.request=request;
}
@Override
public void setServletResponse(HttpServletResponse response){
this.response=response;
}
}

# 액션 클래스
public class RequestAction extends BaseActionSupport{
public String execute() throws Exception{
HttpSesseion session=request.getSession();

return SUCCESS;
}
}


2. 인터셉터 설정

설정파일에 각 인터페이스를 인식할 수 있는 servletConfig 인터셉터를 설정한다

  <action name="request" class="com.juon.board.action.RequestAction">
   <interceptor-ref name="modelDriven" />
   <interceptor-ref name="fileUpload" /> 
   <interceptor-ref name="params" />
   <interceptor-ref name="servletConfig" />
   <result>/board/listBoard.jsp</result>
  </action>

 

 

 

2. request, response 객체 구하기

 

Struts2 에서 Request 를 사용하기 위해서는 ServletActionContext 를 이용해야 한다.

( Strutrs1 과는 매우 다르다 이런점이 )

 

API 를 참조해 보면 ServletActionContext 에는 getRequest() 라는 메서드가 존재 하는데

이 메서드를 이용하여 Request 객체를 얻어 올수가 있다.

 

다행이도 getRequest 메서드는 static 이다 ServletActionContext.getRequest(); 로 request 를 얻어 오도록 하자.

당연하게도 이녀석의 반환형은 HTTP 기반에서 사용할수 있는 HttpServletRequest 이다.

아래와 같이 Request 객체를 얻어 사용하면 되겠다.

 

HttpServletRequest request = ServletActionContext.getRequest();

 

Response 역시 마찬가지 아래와 같이 Response 객체를 얻어 사용하면 되겠다.

 

HttpServletResponse response = ServletActionContext.getResponse();

 

 

Session 얻어 오기

 

Session 의 경우 객체를 얻을수 있는 클래스가 두개가 존재한다.

취향에 맞게 상황에 따라 얻어서 쓸수 있도록 한다.

 

두개의 클래스는 ServletActionContext 와 ActionContext 이다.

이 두녀석은 모두 getContext() 라는 메서드를 가지고 있으며 static 으로 선언되어 있다.

두녀석 모두 ActionContext 를 반환하며 이 ActionContext 라는 녀석이 Session 을 반환하는 getSession 메서드를

가지고 있다.

getSession() 의 반환형은 Map 이다. 주의!!

 

아래와 같은 형태로 얻어 사용하면 되겠다.

Map session = ServletActionContext.getContext().getSession();    // ServletActionContext 를 이용한 경우

Map session = ActionContext.getContext().getSession();           // ActionContext 를 이용한 경우

 

풀어서 쓰게 되면 아래와 같다.

ActionContext context = ServletActionContext.getContext();       // ServletActionContext 를 이용한 경우
Map session = context.getSession();

 

ActionContext context = ActionContext.getContext();              // ActionContext 를 이용한 경우
Map session = context.getSession();

 

 

ActionContext 의 경우 패키지 경로는 아래와 같다.

com.opensymphony.xwork2.ActionContext

 

ServletActionContext 의 경우 패키지 경로는 아래와 같다.

org.apache.struts2.ServletActionContext

[출처] Struts2 Request, Response, Session 얻어오기|작성자 lbiryu

 

- import

     import com.opensymphony.xwork2.ActionContext;

 

- code

      Map session = ActionContext.getContext().getSession();
      session.put("logged_in", "true");

    session.remove("logged-in");

[출처] STRUTS2 에서의 SESSION 생성, 체크, 삭제|작성자 vzm519

 

 

X-internet와 struts2연동시 x-internet 벤더마다 filter를 사용한다던지 하여 나름데로의 통신방식이 있다. 따라서, Client의 요청을 struts2 기본설정으로 받아들이지 못하기 때문에 HttpServletRequest와 HttpServletResponse를 직접 핸들링 해줘야 한다.

 

방법은 2가지..

 

1) ActionSupport를 extends하는 방법과

2) ServletRequestAware, ServletResponseAware를 implements하고

    servlet-config interceptor를 설정해주는 방법이 있다.

 

첫번째 방법은, ActionSupport를 extends하는 방법

#XinternetAction .java

public class XinternetAction extends ActionSupport{

 

    private HttpServletRequest request ;

    private HttpServletResponse response;

 

    public String execute(){

        request = ServletActionContext.getRequest();

        response = ServletActionContext.getResponse();

        //use request & response

        return super.SUCCESS;

    }

}

 

두번째 방법은, ServletRequestAware, ServletResponseAware를 implements하고

    servlet-config interceptor를 설정해주는 방법

 

#XinternetAction .java

public class XinternetAction implements ServletRequestAware, ServletResponseAware {


    private HttpServletRequest request;
    private HttpServletResponse response;


    public String execute(){
        //use request & response

        return Action.SUCCESS;
    }
    
    // implements methods in ServletRequestAware
 public void setServletRequest(HttpServletRequest request) {
  this.request = request;
 }

 // implements methods in ServletResponseAware
 public void setServletResponse(HttpServletResponse response) {
  this.response = response;
 }
}

 

# struts.xml

<package name="default" extends="struts-default">
     <interceptors>
     <interceptor-stack name="defaultStack">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
        <interceptor-ref name="servlet-config"/>
     </interceptor-stack>
  </interceptors>
</package>

 

 

 

===============================================================================

===============================================================================

 

로그인 예제 1

http://www.vitarara.org/cms/struts_2_cookbook/creating_a_login_interceptor

 

 

 

 

로그인 예제 2 

 인터셉터 추가 -> Action에 인터셉터 등록 -> 인터셉터 작성 -> (로그인을 하지 않았을 경우) -> 로그인 페이지로 이동 -> 
(로그인 성공시) 처음 요청한 페이지로 이동

1. 로그인 체크 인터셉터를 등록 합니다.

         <interceptors>
             <interceptor name="loginCheckInterceptor" class="com.common.interceptor.LoginCheckInterceptor" />
         </interceptors>

2. 로그인 체크가 필요한 일반 엑션에 인터셉터를 삽입합니다.

         <action name="pagecode-*" class="pagecode" method="{1}">
            <interceptor-ref name="loginCheckInterceptor" />
            <interceptor-ref name="prepare" />
            <interceptor-ref name="modelDriven" />
            <interceptor-ref name="params" />
            
            <result name="list">/WEB-INF/jsp/ad/pagecode/list.jsp</result>
            <result name="success" type="messageDispatcher">/adadmin/ad/pagecode-list.iptv?adId=${adId}

            </result>
        </action>


3. 인터셉터를 작성합니다.
session에서 member를 검색하여 로그인 여부를 판단합니다. 로그인이 되어 있지 않을경우 현 요청 url을 session에 
담고 로그인
 페이지로 이동합니다.
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getInvocationContext();
        Map session = context.getSession();

        AdMember adMember = (AdMember) session.get("member");
        if (adMember == null) {
            HttpServletRequest request = (HttpServletRequest)context.get(HTTP_REQUEST);
            String queryString = request.getQueryString();
            String currentURI = request.getServletPath() + (queryString != null ?"?"+queryString : "");
            context.getSession().put("url", currentURI);
            return Action.LOGIN;
        }
        return invocation.invoke();
    }

특정 페이지 접근시 로그인 되지 않아 로그인 페이지로 이동한다. 
로그인 페이지에서 아이디 비밀번호를 입력하여 로그인 엑션으로 이동한다.

4. 로그인 페이지를 작성합니다.
일반적인 로그인 페이지와 같습니다. 단 로그인이 성공하면 저장한 "이전 요청 페이지 url"로 이동합니다.
     public String execute() throws Exception {
        if(adMember.getId()!=null && adMember.getPasswd()!=null){
            Map params = new HashMap();
            params.put("id", adMember.getId());
            params.put("isUseDate", "true");
            AdMember mb = commonService.getAdMember(params);
            if(mb!=null && adMember.getPasswd().equals(mb.getPasswd())){
                ActionContext context = ActionContext.getContext();
                Map session = context.getSession();
                context.getSession().put("member", mb);
                currentURI = (String)context.getSession().get("url");//로그인 체크로 인해 접근하지 못했던 이전 요청 페이지 url
                if(currentURI == null && "".equals(currentURI)){
                    currentURI = "/";
                }                
                return SUCCESS;
            }else{
                //비밀번호가 틀림
                return "invalid";
            }
        }else{
            return "invalid";
        }
    }


=============================================
본문서는 자유롭게 배포/복사 할 수 있습니다.
ssung2(썽이) :  (479lgs@naver.com)

덧글을 남겨 주는 쎈스 잊지 마세요!^^

============================================= 

[출처] 스트럿츠2 로그인 체크하기|작성자 썽이자바

 

========================================================================================================================
========================================================================================================================

 

Action Login part

public String executeLoginAction() throws Exception {

         // 성공하든 실패하든 일단 여기까지 진입했으면 무조건 세션을 지워주기 위해 최상단에 선언
         clearSession();

         // 사용자가 없거나 패스워드가 틀리면 userService.login에서 Exception이 발생한다.
         try {
                  userBean = userService.login(userBean);
         } catch (BizException e) {
                  addActionError(e.getMessage());
                  return INPUT;
         }

         clearSession();
         setSessionObject(ServiceConstants.SESS_USER, userBean);

         return SUCCESS;
}

 

Session Check part - Interceptor

public class ServiceAuthInterceptor extends AbstractInterceptor {

         @Override
         public String intercept(ActionInvocation invocation) throws Exception {

                  Object userBean = ActionContext.getContext().getSession().get(
                                    ServiceConstants.SESS_USER);  //get Session Key 값 셋팅

                  if (userBean == null) {
                           return Action.LOGIN;
                  } else {
                           return invocation.invoke();
                  }
         }

}


세션 체크를 위해 모든 action 들이 상속 받는 페키지
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

         <package name="service-default" extends="common-default"
                  namespace="/service">

                  <interceptors>

                           <interceptor name="serviceAuth"
                                    class="kr.sohalee.hangastudio.core.interceptor.ServiceAuthInterceptor" />

                           <interceptor-stack name="serviceDefaultStack">
                                    <interceptor-ref name="commonDefaultStack" />
                           </interceptor-stack>

                           <interceptor-stack name="serviceDefaultAuthStack">
                                    <interceptor-ref name="serviceAuth" />
                                    <interceptor-ref name="commonDefaultStack" />
                           </interceptor-stack>

                  </interceptors>
        
                  <default-interceptor-ref name="serviceDefaultAuthStack" />
                  
                  <!--
                  action 이 LOGIN일 경우 loginForm으로 redirect
                  -->
                  <global-results>
                           <result name="login" type="redirect">
                                    /service/user/loginForm.${extension}
                           </result>
                  </global-results>

         </package>

</struts>

 

 

예제 설정파일  (설정파일 struts.xml 파일 의 상속이 가능하다.)
<struts>

         <package name="service-mail" namespace="/service/menu"
                  extends="service-default">

                  <action name="mailMenu"
                           class="kr.sohalee.hangastudio.presentation.service.mail.MenuAction">
                           <result name="success">
                                    /view/service/mail/mailMenu.jsp
                           </result>
                  </action>

                  <action name="mailMenuAccRecvChange"
                           class="kr.sohalee.hangastudio.presentation.service.mail.MenuAction"
                           method="executeAccRecvChange">
                           <result name="success" type="redirect-action">
                                    mailMenu
                           </result>
                  </action>

         </package>

</struts>


출처>

http://blog.naver.com/PostView.nhn?blogId=tyboss&logNo=70047272543