카테고리 없음

[Spring] Interceptor

321 2021. 5. 1. 23:06

 

  • AOP를 적용한 스프링 mvc의 요소
  • Interceptor는 요청주소에 대해 관심을 갖고 요청이 발생하면 주소를 확인.

 

요청이 컨트롤러한테 가는 과정에서 거치게 됨( 컨트롤러에 도달하지 못하게 할 수 도 있음)

권한확인, 로그인여부확인, 등급별 서비스 사용권한 등에 사용됨

 

인터셉터 등록 방법

1. java에서는 addInterceptor 메서드 생성해서 

2. xml에서는 <interceptors> 태그를 이용해서

 

(servlet-context.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xmlns:beans="http://www.springframework.org/schema/beans"
			 xmlns:context="http://www.springframework.org/schema/context"
			 xsi:schemaLocation="http://www.springframework.org/schema/mvc
			 					 http://www.springframework.org/schema/mvc/spring-mvc.xsd
			 					 http://www.springframework.org/schema/beans
			 					 http://www.springframework.org/schema/beans/spring-beans.xsd
			 					 http://www.springframework.org/schema/context
			 					 http://www.springframework.org/schema/context/spring-context.xsd">
			 					 
	<!-- 스캔한 패지키 내부의 클래스 중 Controller 어노테이션을 가지고 있는 클래스들을 Controller로 로딩하도록 한다 -->
	<annotation-driven/>
	
	<!-- 스캔할 bean들이 모여있는 패키지를 지정한다. -->
	<context:component-scan base-package="컨트롤러 경로"/>
	
	<!-- Controller의 메서드에서 반환하는 문자열 앞 뒤에 붙힐 경로 정보를 셋팅한다. -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/"/>
		<beans:property name="suffix" value=".jsp"/>
	</beans:bean>
	
	<!-- 정적파일(이미지, 사운드, 동영상, JS, CSS 등등) 경로 셋팅 -->
	<resources mapping="/**" location="/resources/"/>
	
	<!-- Interceptor 들을 Bean으로 등록한다. -->
	<beans:bean class='인터셉터경로.TestInterceptor1' id='inter1'/>
	
	<interceptors>
		<interceptor>
			<mapping path="/test1"/>
			<beans:ref bean='inter1'/>
		</interceptor>
		<interceptor>
			<mapping path="/test2"/>
			<beans:bean class='인터셉터경로.TestInterceptor2'/>
		</interceptor>
		<interceptor>
			<mapping path="/test2"/>
			<beans:ref bean="inter1"/>
		</interceptor>
		<interceptor>
			<mapping path="/**"/>
			<exclude-mapping path="/*"/>
			<beans:bean class='인터셉터경로.TestInterceptor3'/>
		</interceptor>
	</interceptors>
			 
</beans:beans>


 

 

구현방법

  • 1. HandlerInterceptor인터페이스를 구현 or 2. HandlerInterceptorAdapter 상속

 

하면 오버라이딩 할수있는 메서드가 3개있음

  • preHandle : 컨트롤러의 메서드가 호출되기 전에 실행됨. 이 메서드가 false를 반환하면 코드의 흐름이 중단된다.
  • postHandle : 컨트롤러의 메서드 수행이 완료되고 뷰처리를 수행하기 전에 호출된다.
  • afterCompletion : 뷰처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.

 

 

1.HandlerInterceptor인터페이스 implements하는 방법.

public class TestInterceptor1 implements HandlerInterceptor{
	// Controller의 메서드가 호출되기 전에 호출됩니다.
	// false 를 반환하면 요청 처리에 대한 진행이 중단됩니다.
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestInterceptor1 - preHandle");
		return true;
	}
	
	// Controller의 메서드가 호출되고 난 후에 호출됩니다.
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestInterceptor1 - postHandle");
	}
	// View 처리까지 완료되면 호출된다.
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestInterceptor1 - afterCompletion");
	}
	
}

 

 

2. HandlerInterceptorAdapter extends 하는 방법.

public class TestInterceptor2 extends HandlerInterceptorAdapter {
	// Controller의 메서드가 호출되기 전에 호출됩니다.
	// false 를 반환하면 요청 처리에 대한 진행이 중단됩니다.
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestInterceptor2 - preHandle");
		return true;
	}

	// Controller의 메서드가 호출되고 난 후에 호출됩니다.
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestInterceptor2 - postHandle");
	}

	// View 처리까지 완료되면 호출된다.
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestInterceptor2 - afterCompletion");
	}
}