MVC——15 自定義攔截器&攔截器棧

自定義攔截器

1.跟過濾器比較像的技術

2.發送請求時被攔截器攔截,在控制器的前後添加額外功能.

  1. 跟 AOP 區分開.AOP 在特定方法前後擴充(對 ServiceImpl)
  2. 攔截器,請求的攔截.針對點是控制器方法(對 Controller)

3.SpringMVC 攔截器和 Filter 的區別

  1. 攔截器只能攔截器 Controller
  2. Filter 可以攔截任何請求

4.實現自定義攔截器的步驟:

  1. 新建類實現 HandlerInterceptor
public class DemoInterceptor implements HandlerInterceptor {
//在進入控制器之前執行 
//如果返回值爲 false,阻止進入控制器 
//控制代碼 @Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { 
System.out.println("arg2:"+arg2); 
System.out.println("preHandle"); 
return true; 
}
//控制器執行完成,進入到 jsp 之前執行. 
//日誌記錄. 
//敏感詞語過濾 
@Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, 
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("往"+arg3.getViewName()+"跳轉");
System.out.println("model 的值 "+arg3.getModel().get("model")); 
String word = arg3.getModel().get("model").toString();
String newWord = word.replace("祖國", "**"); 
arg3.getModel().put("model", newWord);
// arg3.getModel().put("model", "修改後的內容"); 
System.out.println("postHandle"); }
//jsp 執行完成後執行 
//記錄執行過程中出現的異常. 
//可以把異常記錄到日誌中 
@Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, 
Object arg2, Exception arg3) throws Exception {
System.out.println("afterCompletion"+arg3.getMessag e()); 
} 
}
  1. 在 springmvc.xml 配置攔截器需要攔截哪些控制器

①攔截所有控制器

<mvc:interceptors> <bean class="com.youdian.interceptor.DemoInterceptor"></bean>
</mvc:interceptors>

②攔截特定的的 url

<mvc:interceptors> 
<mvc:interceptor> 
<mvc:mapping path="/demo"/> 
<mvc:mapping path="/demo1"/> 
<mvc:mapping path="/demo2"/> 
<bean class="com.youdian.interceptor.DemoInterceptor"></bean> 
</mvc:interceptor> 
</mvc:interceptors>

攔截器棧

  1. 多個攔截器同時生效時,組成了攔截器棧
  2. 順序:先進後出
  3. 執行順序和在 springmvc.xml 中配置順序有關
  4. 設置先配置攔截器 A 在配置攔截器 B 執行順序爲
    preHandle(A)–> preHandle(B)–> 控制器方法 -->postHandle(B)–>postHanle(A)–>JSP–>afterCompletion(B)–>afterCompletion(A)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章