13.4.3. Intercepting requests - the HandlerInterceptor interface
HandlerMapping 안에 interceptor를 만들어서 HandlerMapping에 들어오는 요청들 중에 일부를 처리하는 Handler 하테 요청을 세 가지 시점(넘기기 전과 후, 완료 된 후)에 특정 작업을 추가할 수 있습니다.
레퍼런스에 나와있는 예제는 특정 시간 사이에 들어오는 요청이 아니면 모두 특정 페이지로 요청을 넘겨 버리게 됩니다.
먼저 인터셉터를 만들려면 HandlerInterceptor 인터페이스를 구현해야 합니다.
구현해야 할 메소드는 세 개이며 저 중에서 원 하는 것만 구현해서 사용할 수 있도록 어댑터 클레스를 제공합니다.
public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
private int openingTime;
private int closingTime;
public void setOpeningTime(int openingTime) {
this.openingTime = openingTime;
}
public void setClosingTime(int closingTime) {
this.closingTime = closingTime;
}
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
Calendar cal = Calendar.getInstance();
int hour = cal.get(HOUR_OF_DAY);
if (openingTime <= hour < closingTime) {
return true;
} else {
response.sendRedirect("http://host.com/outsideOfficeHours.html");
return false;
}
}
}
예제에서는 이 어댑터를 사용하여 구현하였으며 preHandler 메소드를 사용하여 요청을 핸들러에게 넘기기 전에 작업을 합니다. 작업의 내용은 현재 요청이 들어온 시간이 특정 시간 사이라면 true, 아니면 http://host.com/outsideOfficeHours.html 여기로 요청을 넘기고 false를 리턴합니다.
인터셉터를 사용하려면 HandlerMapping의 peopertie에 등록해 주면 됩니다.
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="officeHoursInterceptor"/>
</list>
</property>
<property name="mappings">
<value>
/*.form=editAccountFormController
/*.view=editAccountFormController
</value>
</property>
</bean>
<bean id="officeHoursInterceptor"
class="samples.TimeBasedAccessInterceptor">
<property name="openingTime" value="9"/>
<property name="closingTime" value="18"/>
</bean>
<beans>
요청을 처리하기 전에 로그인 되어 있는지 확인하는 로직을 이렇게 구현해도 될 것 같네요.