1. 程式人生 > >【Java.Spring.MVC】使用HandlerInterceptor攔截請求

【Java.Spring.MVC】使用HandlerInterceptor攔截請求

Spring的handler mapping機制提供了handler interceptors,可以用來為特定的請求新增特定的功能,如,檢測資金額等。

handler mapping的攔截器必須實現HandlerInterceptor的介面。該介面定義了三個方法:

  • preHandler() - 在實際的handler被執行前被呼叫
  • postHandler() - 在handler被執行後被呼叫
  • afterCompletion() - 當request處理完成後被呼叫

preHandler()方法返回一個布林值。可以使用該方法繼續或者中斷執行鏈。當返回true,繼續執行鏈;如果返回false,則停止後續的執行。

Interceptor使用interceptors屬性進行配置,該屬性為HandlerMapping類的屬性。

例如:

<beans>
    <bean id="handlerMapping"
            class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="officeHoursInterceptor"/>
            </list>
        </property>
    </bean>

    <bean id="officeHoursInterceptor"
            class="samples.TimeBasedAccessInterceptor">
        <property name="openingTime" value="9"/>
        <property name="closingTime" value="18"/>
    </bean>
<beans>
package samples;

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 && hour < closingTime) {
            return true;
        }
        response.sendRedirect("http://host.com/outsideOfficeHours.html");
        return false;
    }
}

該handler請求的任何request都會被TimeBasedAccessInterceptor所中斷。

使用是配置HandlerInterceptorAdaptor類作為中斷器的基類(HandlerInterceptor介面的實現類)。