코딩

[Spring] Interceptor 정리 본문

Spring

[Spring] Interceptor 정리

ssooyn_n 2022. 4. 21. 17:17

Interceptor 등록하기

servlet-context.xml

<beans:bean id="confirm" class="com.abcd.interceptor.ConfirmInterceptor"/>

	<interceptors>
		<interceptor>
			<!-- <mapping path="/guestbook/*"/> -->
			<mapping path="/guestbook/register"/>
			<mapping path="/guestbook/modify"/>
			<mapping path="/guestbook/delete"/>
			<!-- <exclude-mapping path="/user/log*"/> -->
			
			<beans:bean class="com.abcd.interceptor.ConfirmInterceptor"/>
			<beans:ref bean="confirm"/>
		</interceptor>
	</interceptors>

위와 같이 servlet-context.xml에서 bean으로 Interceptor가 있는 경로를  지정하여 저장해줍니다.

그리고 그 아래에 Interceptor가 관여할 메소드들이 있는 경로를 mapping해주고 참조할(ref) Interceptor클래스의 id를 지정해줍니다.

Interceptor 순서정하기

	<beans:bean id="Interceptor1" class="com.abcd.interceptor.ConfirmInterceptor"/>
	<beans:bean id="Interceptor2" class="com.abcd.interceptor.TestInterceptor"/>

	<interceptors>
		<interceptor>
			<mapping path="/guestbook/register"/>
            <beans:ref bean="Interceptor1"/>
		</interceptor>
		<interceptor>
			<mapping path="/guestbook/list"/>
			<beans:ref bean="Interceptor2"/>
		</interceptor>
	</interceptors>

인터셉트는 여러 클래스를 등록하는것이 가능합니다.

인터셉트가 실행되는 순서도 servlet-context.xml에서 정할 수 있습니다.

servlet-context.xml에서 위와같이 Interceptor를 등록했다면 진행 순서는 아래와 같습니다.

preHandler는 순서대로 진행되지만 post, after은 역순으로 진행된다.

 

Interceptor 클래스 만들기

@SuppressWarnings("deprecation")
public class Interceptor1 extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		HttpSession session = request.getSession();
		System.out.println("#1 Interceptor1 preHandler");
        return true; //false를 반환하면 바로 Interceptor가 종료됩니다.	
	}

	@Override //컨트롤러 수행 후 호출 됩니다.
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("#1 Interceptor1 postHandler");
	}

	@Override // view를 통해 클라이언트에게 응답을 전송한 뒤 실행됩니다.
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("#1 Interceptor1 afterHandler");
	}
	
}

여기서 조심해야 할 것은 afterCompletion메소드는 에러가 발생하여도 실행된다는 점입니다.

Comments