spring MVC session interceptor 예외처리(Spring3.2 & 3.1이하 )
스프링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); } } |