自定義攔截器
1.跟過濾器比較像的技術
2.發送請求時被攔截器攔截,在控制器的前後添加額外功能.
- 跟 AOP 區分開.AOP 在特定方法前後擴充(對 ServiceImpl)
- 攔截器,請求的攔截.針對點是控制器方法(對 Controller)
3.SpringMVC 攔截器和 Filter 的區別
- 攔截器只能攔截器 Controller
- Filter 可以攔截任何請求
4.實現自定義攔截器的步驟:
- 新建類實現 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());
}
}
- 在 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>
攔截器棧
- 多個攔截器同時生效時,組成了攔截器棧
- 順序:先進後出
- 執行順序和在 springmvc.xml 中配置順序有關
- 設置先配置攔截器 A 在配置攔截器 B 執行順序爲
preHandle(A)–> preHandle(B)–> 控制器方法 -->postHandle(B)–>postHanle(A)–>JSP–>afterCompletion(B)–>afterCompletion(A)