스프링 인터셉터 사용하기
인터셉터란?
클라이언트 요청이 Controller로 들어가기 전에 가로채서 검사하는 모듈.
예를 들어서 로그인을 하지 않은 클라이언트에게 페이지를 보여주고 싶지 않을 때.
또는 세션이 시간이 지나서 끊겼을 때 다시 로그인 하는 페이지로 보내고 싶을 때.
인터셉터를 두어서 세션 검사를 하고 다른페이지도 이동시키던가 하면 됩니다.
구현방법
dispatcher-servlet.xml
<!-- 엑셀 interceptor -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/admin/excel/*.do" />
<mvc:exclude-mapping path="/admin/*.do" />
<bean class="com.excel.interceptor.Interceptor" />
</mvc:interceptor>
</mvc:interceptors>
후에
public class Interceptor extends HandlerInterceptorAdapter {
}
이런식으로 HandlerInterceptorAdapter 상속해서 오버라이딩 하여, 구현하면 된다.
아래는 HandlerInterceptorAdapter 입니다.
HandlerInterceptorAdapter
/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.servlet.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* Abstract adapter class for the {@link AsyncHandlerInterceptor} interface,
* for simplified implementation of pre-only/post-only interceptors.
*
* @author Juergen Hoeller
* @since 05.12.2003
*/
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
/**
* This implementation always returns {@code true}.
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* This implementation is empty.
*/
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
}
/**
* This implementation is empty.
*/
@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
/**
* This implementation is empty.
*/
@Override
public void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
}
}
HandlerInterceptorAdapter에서 제공하는 메서드는 4가지입니다.
- PreHandle (HttpServletRequest request, HttpServletResponse response, Object handler)
- 컨트롤러(즉 RequestMapping이 선언된 메서드 진입) 실행 직전에 동작.
- 반환 값이 true일 경우 정상적으로 진행이 되고, false일 경우 실행이 멈춥니다.(컨트롤러 진입을 하지 않음)
- 전달인자 중 Object handler는 핸들러 매핑이 찾은 컨트롤러 클래스 객체입니다.
- PostHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- 컨트롤러 진입 후 view가 랜더링 되기 전 수행이 됩니다.
- 전달인자의 modelAndView을 통해 화면 단에 들어가는 데이터 등의 조작이 가능합니다.
- afterComplete (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- 컨트롤러 진입 후 view가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드입니다.
- afterConcurrentHandlingStarted (HttpServletRequest request, HttpServletResponse response, Object handler)
- Servlet 3.0부터 비동기 요청이 가능해짐에 따라 비동기 요청 시 PostHandle와 afterCompletion메서드를 수행하지 않고 이 메서드를 수행하게 됩니다. (Spring에서 제공함)