Programing/Spring

Spring Interceptor 활용 세션 설정 인터셉터 세션설정 ajax, 페이지연결 구분

리커니 2017. 3. 31.
반응형

 

Spring Interceptor 활용 세션 설정 인터셉터 세션설정 ajax, 페이지연결 구분

 

이전 포스팅에서 AOP를 사용하여 세션을 체크 했었는데..

이것에 문제가 있었죠.

 

아무리 리다이렉트를 해도 페이지가 넘어가지 않았던것..(분명 됐던거 같지만..)

원인은 차근차근 찾아보기로 하고..

(↓안된다....)

Link : AOP 설정을 활용한 세션체크

 

그래서 찾아본 것이 Spring 의 Interceptor를 활용해서 세션을 체크하는 방법입니다..

그럼 이 방법에 대해서 알아보겠습니다.

 

우선 로그인 세션을 체크하는 클래스를 작성합니다.

 

 

-- 코드 텍스트

 

public class LoginCheckInterceptor extends HandlerInterceptorAdapter{

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        boolean result = false;
        String webRoot = request.getContextPath();
         
        try {
         String id = (String) request.getSession().getAttribute("oprId");
            if(id == null ){
                if(isAjaxRequest(request)){
                    response.sendError(400);
                    return false;
                }else{
                    response.sendRedirect(webRoot + "/loginPage.do");  
                    result =  false;
                }
            }else{
                result =  true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            return false;
        }
        return result;
    }
     
    private boolean isAjaxRequest(HttpServletRequest req) {
        String header = req.getHeader("AJAX");
        if ("true".equals(header)){
         return true;
        }else{
         return false;
        }
    }
}​

 

 

 

코드는 간단합니다.

HandlerInterceptorAdapter를 extends 하는 클래스를 생성 후

세션에 oprId라는 값이 있을 경우 true 를 없을 경우는 false 를 리턴하면 됩니다.

하지만 여기서 ajax 요청과 아닌 요청을 구분 해 두었습니다.

ajax일 경우 400이라는 에러코드를 리턴하고, 아닐경우 리다이렉트를 하는 방식입니다.

 

* Interceptor 의 실행시점

preHandle() : 컨트롤러 요청 전

postHandle() : 컨트롤러에 들어갔다 나온 후 뷰로 보내기 전

afterCompletion() : 뷰까지 끝나고 난 후

 

세션의 체크는 컨트롤러를 실행할 필요없는 로직이기 때문에 preHandle()만을 사용했습니다.

 

여기서 ajax를 구분하는 것은 요청의 헤더 값을 받아서 합니다.

그러니 ajax 요청시 헤더에 값을 추가 해주어야 하고, 넘어온 400 이라는 status에 대한 처리도 추가 해주어야 합니다.

(아래 참고)

 

 

 

beforeSend 부분에 헤더값을 추가해 주었고, e.status로 400이라는 코드값에 대한 처리를 작성하였습니다.

 

 

이제 세션를 체크하는 로직은 작성이 되었고, 언제 실행 시킬지에 대한 설정만을 해주면 됩니다.

 

dispatcher-servlet.xml 에 아래 코드를 추가합니다.

 

 

 

- 텍스트 코드

 <mvc:interceptors>
  <mvc:interceptor>
   <mvc:mapping path="/**/*.do"/>
   <mvc:exclude-mapping path="/adminMng/checkLogin.do"/>
   <mvc:exclude-mapping path="/adminMng/logout.do"/>
   <mvc:exclude-mapping path="/loginPage.do"/>
   <bean class="egovframework.neighbor.cmmn.web.LoginCheckInterceptor"></bean>
  </mvc:interceptor>
 </mvc:interceptors>​

 

<mvc:mapping> 으로 interceptor 할 경로를 설정합니다.

기본적으로 로그인체크와 로그인, 로그아웃 페이지에서 로그인을 체크할 필요는 없으니

exclude-mapping 으로 해당 경로는 제외해 줍니다.

 

이제 exclude-mapping 을 제외한 모든 do 요청에 대해 Interceptor 가 실행되게 됩니다.

 

일반 요청은 세션값이 없을 경우 로그인페이지로 이동,

ajax 요청은 세션값이 없을 경우 400 코드 값을 던져 사용자가 경고창을 확인 한 후 로그인 페이지로 이동.

반응형

댓글

💲 추천 글