일반적인 사용자 외에 직접 주소를 쳐서 접근 하는 사용자를 방지하기 위하여

매번 해당되는 요청시 마다 login검사를 해줘야 하는 경우가 있다.

 

이 경우 login검사를 모든 컨트롤러에서 해주기엔 게시판 하나만 있는 사이트라면 모를까

다수의 기능을 가지고 있는 사이트에서라면 굉장히 애로사항이 꽃을 피울만한 일이다.

 

이런 경우에 login검사 처리를 Spring에서 제공하는 Interceptor를 사용하여 한번에 해결 가능하다

 

InterCeptor에서 제공하는 3가지 메소드는 각각 개입하는 시점이 다르다.

  • preHandle - Controller 실행 요청전
  • postHandle - view(jsp)로 forward되기 전에
  • afterCompletion - 끝난뒤

login 검사를 해야 될 시점은 Dispatcher가 해당 controller로 이어주기 전에 해야 되므로 preHandle메소드를 사용하여 처리하겠다.

HandlerInterceptorAdapter을 상속받은 LoginCheckInterceptor 을 만든다.

 


public class LoginCheckInterceptor extends HandlerInterceptorAdapter {

 

 @Override
 public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler) throws Exception {
  // TODO Auto-generated method stub
  

  // session검사
  HttpSession session = request.getSession(false);
  

   if (session == null) {
   // 처리를 끝냄 - 컨트롤로 요청이 가지 않음.
   response.sendRedirect("/login.do");
   return false;
  }
  
  String userId = (String)session.getAttribute("userId");
  if (userId == null) { 
   response.sendRedirect("/login.do");  
   return false;
  }
  return true;
 }
}

preHandle은 리턴값이 boolean형태다. 리턴값이 true가 아닐경우 해당 컨트롤러로 이어주지 않는다.

 

만들어 놓은 login검사를 위한 intercepor인  loginCheckInterceptor를 사용하기 위하여 설정파일에서 bean객체로 설정한다.

 

<!-- Login Check Interceptor -->
<bean id="loginCheckInterceptor" class="test.interceptor.LoginCheckInterceptor" /> 

 

이제 해당 UrlHandlerMapping 사용시 interceptor를 사용하기 위하여 프로퍼티로 추가 한다

 

<bean id="UrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

   <!-- interceptor 추가 -->

  <property name="interceptors">
   <list>
    <ref bean="loginCheckInterceptor" />
   </list>
  </property>

 

  <property name="alwaysUseFullPath" value="true" />
  
  <property name="mappings">
   <props>
  <prop key="/main.do">menuManagementController</prop>
    
   </props>
  </property>
 </bean>

 

이제 main.do라는 요청이 들어오게 되면 해당 컨트롤러인 menuManagementController로 가기 전에

loginCheckInterceptor에서 login검사를 한 후 로그인이 되어 있지 않을 경우 다시 로그인 검사로(login.do)로 보내게 될 것이다.

 

 

[출처] http://blog.naver.com/gigar/60103191032



Posted by linuxism
,