【Java.Spring.MVC】使用HandlerInterceptor攔截請求
阿新 • • 發佈:2019-02-07
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介面的實現類)。