W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Spring的處理器映射機制包含了處理器攔截器。攔截器在你需要為特定類型的請求應(yīng)用一些功能時可能很有用,比如,檢查用戶身份等。
處理器映射處理過程配置的攔截器,必須實現(xiàn) org.springframework.web.servlet
包下的 HandlerInterceptor
接口。這個接口定義了三個方法: preHandle(..)
,它在處理器實際執(zhí)行 之前 會被執(zhí)行; postHandle(..)
,它在處理器執(zhí)行 完畢 以后被執(zhí)行; afterCompletion(..)
,它在 整個請求處理完成 之后被執(zhí)行。這三個方法為各種類型的前處理和后處理需求提供了足夠的靈活性。
preHandle(..)
方法返回一個boolean值。你可以通過這個方法來決定是否繼續(xù)執(zhí)行處理鏈中的部件。當(dāng)方法返回 true
時,處理器鏈會繼續(xù)執(zhí)行;若方法返回 false
, DispatcherServlet
即認(rèn)為攔截器自身已經(jīng)完成了對請求的處理(比如說,已經(jīng)渲染了一個合適的視圖),那么其余的攔截器以及執(zhí)行鏈中的其他處理器就不會再被執(zhí)行了。
攔截器可以通過interceptors
屬性來配置,該選項在所有繼承了AbstractHandlerMapping
的處理器映射類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;
}
}
在上面的例子中,所有被此處理器處理的請求都會被TimeBasedAccessInterceptor
攔截器攔截。如果當(dāng)前時間在工作時間以外,那么用戶就會被重定向到一個HTML文件提示用戶,比如顯示“你只有在工作時間才可以訪問本網(wǎng)站”之類的信息。
使用
RequestMappingHandlerMapping
時,實際的處理器是一個處理器方法HandlerMethod
的實例,它標(biāo)識了一個將被用于處理該請求的控制器方法。
如你所見,Spring的攔截器適配器HandlerInterceptorAdapter
讓繼承HandlerInterceptor
接口變得更簡單了。
上面的例子中,所有控制器方法處理的請求都會被配置的攔截器先攔截到。如果你想進一步縮小攔截的URL范圍,你可以通過MVC命名空間或MVC Java編程的方式來配置,或者,聲明一個
MappedInterceptor
類型的bean實例來處理。具體請見 21.16.1 啟用MVC Java編程配置或MVC命名空間配置一小節(jié)。
需要注意的是,HandlerInterceptor
的后攔截postHandle
方法不一定總是適用于注解了@ResponseBody
或ResponseEntity
的方法。這些場景中,HttpMessageConverter
會在攔截器的postHandle
方法被調(diào)之前就把信息寫回響應(yīng)中。這樣攔截器就無法再改變響應(yīng)了,比如要增加一個響應(yīng)頭之類的。如果有這種需求,請讓你的應(yīng)用實現(xiàn)ResponseBodyAdvice
接口,并將其定義為一個@ControllerAdvice
bean或直接在RequestMappingHandlerMapping
中配置。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: