SpringMVC中攔截器的使用


什么是攔截器

攔截器通常一般指的是通過攔截從瀏覽器發往服務器的一些請求來完成某些功能的一段程序代碼
一般在一個請求發生之前,發生時,發生后我們都可以對請求進行攔截

攔截器可以做什么

攔截器可以用於權限驗證、解決亂碼、操作日志記錄、性能監控、異常處理等

自定義攔截器

可以通過繼承Spring框架中的HandlerInterceptorAdapter類,然后重寫preHandle,postHandle,afterCompletion三個方法,在三個方法中寫我們自己要想實現的業務邏輯代碼.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 自定義攔截器
* @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文件中配置:

1
2
3
<mvc:interceptors>
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
</mvc:interceptors>

 

當有多個攔截器的時候可以寫多個bean
當我們只想攔截部分指定請求時:

1
2
3
4
5
<mvc:interceptors>
<!-- path:需要攔截的請求,不寫時會攔截所有請求 -->
<mvc:mapping path="/*.htm" />
<bean id="myInterceptor" class="com.admol.web.MyInterceptor" />
</mvc:interceptors>

 

多個攔截器

xml配置:

1
2
3
4
<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.過濾器的過濾范圍更大,還可以過濾一些靜態資源,攔截器只攔截請求


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM