인터셉터란?

클라이언트 요청이 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에서 제공함)

출처 : jhkang-tech.tistory.com/53