1. request, response 객체 구하기
몇 가지 방식이 있다고 하는데, 여기서는 ServletRequestAware, ServletResponseAware 인터페이스를 상속하는 방법입니다.
1. 인터페이스의 구현
해당 액션에서 직접 구현해도 좋고, 아니면 각 인터페이스를 구현한 클래스를 구현한 뒤 상속하는 것도 좋다.
다만 구현하는 클래스에 HttpServletRequest와 HttpServletResponse 변수를 선언한 뒤 각 인터페이스의 추상메서드를 구현해야 한다.
여기서는 따로 구현한 클래스를 만든 뒤 상속받아서 사용한다.
public class BaseActionSupport extends ActionSupport implements ServletRequestAware, ServletResponseAware{
HttpServletResponse response;
@Override
@Override
public void setServletResponse(HttpServletResponse response){
# 액션 클래스
public class RequestAction extends BaseActionSupport{
return SUCCESS;
2. 인터셉터 설정
설정파일에 각 인터페이스를 인식할 수 있는 servletConfig 인터셉터를 설정한다
<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}"> </result> |
3. 인터셉터를 작성합니다.
담고 로그인 페이지로 이동합니다.
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. 로그인 페이지를 작성합니다.
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