코딩하는 문과생

[Spring] Spring 프레임워크(12) - 인터셉터와 로그인 본문

웹 프로그래밍/Spring

[Spring] Spring 프레임워크(12) - 인터셉터와 로그인

코딩하는 문과생 2020. 3. 12. 15:48

[인터셉터]

- Spring Interceptor

  • 서블릿 필터와 유사: 모든 요청과 응답 시 거쳐야 함
  • 서블릿 필터와 다름: 스프링 컨테이너 로딩 후 적용

 

 

  • preHandle: 컨트롤러 실행 전
  • postHandle: 컨트롤러 실행 후, 아직 뷰를 실행하기 전
  • afterCompletion: 뷰를 실행한 이후

-사례: 웹 요청 처리 시간을 측정하는 Interceptor

preHandle과 afterCompletion을 이용해 제작

HandlerInterceptorAdapter 상속받아서 인터셉터 생성

servlet-context(web과 관련된 설정파일)에서 설정: 하나의 빈으로 설정, 특정경로 설정 가능

 

[로그인 처리]

  • 로그인 Interceptor = 세션트래킹
  • 로그인시 세션에 사용자 정보를 저장한다.
  • <mvc:mapping>, <mvc:exclude>를 이용해 url맵핑 가능
  • 인터셉터가 선언된 순서대로 실행된다. 체이닝형태로 작성이 가능하다.

 

[AOP와 인터셉터 차이점]

공통점: 둘다 호출을 가로챈다

차이점: AOP는 서비스와 DAO에서,  인터셉터는 Controller 호출을 가로챈다.

 

 

ex. 인터셉터 작성: 웹 요청 처리 시간을 측정하는 Interceptor

- MeasuringInterceptor

package kr.co.acomp.hello.Interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MeasuringInterceptor extends HandlerInterceptorAdapter{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		request.setAttribute("mi.beginTime", System.currentTimeMillis());
		return true;
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		long beginTime = (long)request.getAttribute("mi.beginTime");
		long endTime = System.currentTimeMillis();
		
		System.out.println(request.getRequestURI() + " executing Time: " + (endTime - beginTime));
	}

}

-servlet-context.xml 추가

	<mvc:interceptors>
		<mvc:interceptor>
		<mvc:mapping path="/bbs/**/"/>
			<bean id="measuringInterceptor" class="kr.co.acomp.hello.Interceptor.MeasuringInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

-BbsController 수정

	@GetMapping("")
	public String index() {
		// bbsService.registArticle(new Article(5, "jj", "test", "testtest"));
		//예외가 여기로 넘어온다.->GlobalExceptionHandler가 호출
		return "index";
	}

측정된 실행 시간