什麼是攔截器
攔截器可以做什麼
攔截器可以用於權限驗證、解決亂碼、操作日志記錄、性能監控、異常處理等
自定義攔截器
可以通過繼承Spring框架中的HandlerInterceptorAdapter類,然後重寫preHandle,postHandle,afterCompletion三個方法,在三個方法中寫我們自己要想實現的業務邏輯代碼。
/**
* 自定義攔截器
* @author admol
*/
public class MyInterceptor extends HandlerInterceptorAdapter {
/**
* 在請求之前執行
* @param request
* @param response
* @param handler 表示被攔截的請求目標
* @return false:攔截請求,終止請求 true:繼續執行請求
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//業務邏輯代碼編寫...(如:解決亂碼,權限驗證)
request.setCharacterEncoding("utf-8");
return true;
}
/**
* @param modelAndView 可以對視圖進行操作
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
//業務邏輯代碼編寫...(如:操作日志記錄,更改視圖信息)
}
/**
* @param ex 異常
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
//業務邏輯代碼編寫...(如:,資源銷毀,異常處理)
}
}
a) public boolean preHandle(HttpServletRequest request,HttpServletResponse response,
Object handler) throws Exception
該方法在action執行前執行,可以實現對數據的預處理,比如:編碼、防重復提交安全控制等。
如果方法返回true,則繼續執行action。返回false則攔截請求
b) public void postHandle(HttpServletRequest request,HttpServletResponse response,
Object handler,ModelAndView modelAndView) throws Exception
該方法在action執行後,生成視圖前執行。在這裡,我們有機會修改視圖層數據。
c) public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
最後執行,通常用於釋放資源,處理異常。我們可以根據ex是否為空,來進行相關的異常處理。
注冊攔截器
在xml文件中配置:
<mvc:interceptors>
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
</mvc:interceptors>
當有多個攔截器的時候可以寫多個bean
當我們只想攔截部分指定請求時:
<mvc:interceptors>
<!-- path:需要攔截的請求,不寫時會攔截所有請求 -->
<mvc:mapping path="/*.htm" />
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
</mvc:interceptors>
多個攔截器
xml配置:
<mvc:interceptors>
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
<bean id="myInterceptor2" class="com.admol.web.MyInterceptor2" />
</mvc:interceptors>
當配置有多個攔截器的時候,會按攔截器順序執行preHandle方法,然後再倒序執行postHandle和afterCompletion方法。
其他實現方式
1.實現接口 implements HandlerInterceptor
2.實現接口 implements WebRequestInterceptor
注冊攔截器方法不變
與過濾器的區別
1.過濾器是依賴於Servlet容器,基於回調函數,Intercepto依賴與框架,基於反射機制
2.過濾器的過濾范圍更大,還可以過濾一些靜態資源,攔截器只攔截請求
Spring+SpringMVC企業快速開發架構搭建 http://www.linuxidc.com/Linux/2015-09/122942.htm
SpringMVC的亂碼處理 http://www.linuxidc.com/Linux/2015-07/120542.htm
Spring MVC+Spring3+Hibernate4開發環境搭建 http://www.linuxidc.com/Linux/2013-07/87119.htm
Spring MVC整合Freemarker基於注解方式 http://www.linuxidc.com/Linux/2013-02/79660.htm
基於注解的Spring MVC簡單介紹 http://www.linuxidc.com/Linux/2012-02/54896.htm
SpringMVC詳細示例實戰教程 http://www.linuxidc.com/Linux/2015-06/118461.htm
Spring MVC 框架搭建及詳解 http://www.linuxidc.com/Linux/2012-01/52740.htm
SpringMVC 異常處理 http://www.linuxidc.com/Linux/2015-06/119049.htm