Spring為我們提供了:
org.springframework.web.servlet.HandlerInterceptor接口,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter適配器,
實現(xiàn)這個接口或繼承此類,可以非常方便的實現(xiàn)自己的攔截器。
例如:
public class HelloWorldInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Pre-handle"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Post-handle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("After completion handle"); }
有以下三個方法:
Action之前執(zhí)行:
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler);生成視圖之前執(zhí)行
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView);最后執(zhí)行,可用于釋放資源
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)分別實現(xiàn)預(yù)處理、后處理(調(diào)用了Service并返回ModelAndView,但未進行頁面渲染)、返回處理(已經(jīng)渲染了頁面)
在preHandle中,可以進行編碼、安全控制等處理;
在postHandle中,有機會修改ModelAndView;
在afterCompletion中,可以根據(jù)ex是否為null判斷是否發(fā)生了異常,進行日志記錄。
參數(shù)中的Object handler是下一個攔截器。
在spring MVC的配置文件中配置有三種方法:
方案一,(近似)總攔截器,攔截所有url
如果是REST風格的URL,靜態(tài)資源也會被攔截。
<mvc:interceptors> <bean class="com.app.mvc.MyInteceptor" /> </mvc:interceptors>
方案二, 攔截匹配的URL。
如果是REST風格的URL,靜態(tài)資源也會被攔截。
<mvc:interceptors > <mvc:interceptor> <mvc:mapping path="/user/*" /> <!-- /user/* --> <bean class="com.mvc.MyInteceptor"></bean> </mvc:interceptor> </mvc:interceptors>
方案三,HandlerMappint上的攔截器。
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <bean class="com.mvc.MyInteceptor"></bean> </list> </property> </bean>
如果使用了<mvc:annotation-driven />,它會自動注冊DefaultAnnotationHandlerMapping 與AnnotationMethodHandlerAdapter 這兩個bean,所以就沒有機會再給它注入interceptors屬性,就無法指定攔截器。
我們可以通過人工配置上面的兩個Bean,不使用<mvc:annotation-driven />,就可以給interceptors屬性注入攔截器了。
新聞熱點
疑難解答