- 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");
}
}