Spring

spring MVC session interceptor 예외처리(Spring3.2 & 3.1이하 )

deerfrd 2017. 2. 20. 22:16
반응형

스프링MVC에서 인터셉터를 통해, preHandle 메소드를 통해 Controller들을 호출하기 전에 인터셉터를 수행하여, 세션에 값이 안들어있는(비어있는) 상태면 login페이지로 redirect 해주는것은 알 것이다.

근데 사이트의 모든 페이지에서 상단의 로직을 타게 하고 싶어서 mapping path를 /** 로 줬는데, 크롬에서 '리디렉션한 횟수가 너무 많습니다' 라는 에러 페이지가 자꾸떴다 ㅜㅜ..


문제는 바로 이 부분,

if(id == null){

response.sendRedirect("/hiworld/login.do");

return false;

}

id(세션에 있는 id값)가 없을때, /login.do로 리다이렉트 되도록 설정해 두었는데, 문제는 내가 mapping path를 전체로 줘서 /login.do 로 리다이렉트 돼서 그쪽으로 가도, 그 곳에도 세션id값이 없으니까 계속 /login.do로 리다이렉트 되는 무한 리다이렉트 지옥에 빠져버린 것 ㅜㅜ.. 


이를 해결하기 위해서는 방법이 있었는데, 일단 <exclude-mapping> 을 이용해서 /login.do 를 제외시키는 방법이 있었음.

하지만 이건 Spring 3.2에서만 됨.


그렇다면 본문, Spring 3.1이하에서는 <exclude-mapping> 대신 어떻게 하면 되느냐!


인터셉터의 preHandle 메소드 부분에서 url을 체크해줘서, /login.do가 url에 포함되어 있으면 return true; 처리를 해주면 된다. (하단 파란색 부분)




servlet.xml

<interceptors>

<interceptor>

<mapping path="/**"/>

<beans:bean id="loginInterceptor" class="hiworld.common.logger.loginInterceptor"></beans:bean>

</interceptor>

</interceptors>


loginInterceptor.java 안의 preHandle 메소드 부분

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

if (log.isDebugEnabled()) {

HttpSession session = request.getSession();

String id = (String)session.getAttribute("id");

//exclude-mapping 대신, 요청된 url

String requestUrl = request.getRequestURL().toString();

//하단의 Url 체크를 통해, login 페이지는 예외처리를 해줘야 무한 리디렉션에서 벗어날 수 있다

if(requestUrl.contains("/login.do")){

return true;

}

//세션 체크

if(id == null){

response.sendRedirect("/login.do");

return false;

}

return super.preHandle(request, response, handler);

}

}









반응형