一 自定義攔截器
? ? 1. 跟過濾器比較像的技術
? ? 2.發(fā)送請求時被攔截器攔截,在控制器前后添加額外功能
? ? ? ? 2.1 跟AOP 區(qū)分開,AOP 在特定方法前后擴充(對ServiceImpl)
? ? ? ? 2.2 攔截器,請求攔截,針對點是控制器方法(對Controller)
????3. SpringMVC 攔截器 和 Filter的區(qū)別
? ? ? ? 3.1 攔截器只能攔截Controller
? ? ? ? 3.2 Filter可以攔截任何請求
????4. 實現(xiàn)自定義攔截器的步驟
? ? ? ? 4.1 新建類實現(xiàn) HandlerInterceptor 接口
package com.chen.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class DemoInterceptor implements HandlerInterceptor{
????//在進入控制器之前執(zhí)行
????//如果返回值為false,阻止進入控制器
????//控制代碼
????@Override
????public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
????????System.out.println("arg2:"+arg2);
????????System.out.println("preHandle");
????????return true;
????}
? ? //控制器執(zhí)行完成,進入jsp之前執(zhí)行.
????//日志記錄
????//敏感詞語過濾
????@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);
????????System.out.println("postHandle");
????}
????//jsp執(zhí)行完成后執(zhí)行
????//記錄執(zhí)行過程中出現(xiàn)的異常
????//可以把異常幾率到日志中
????@Override
????public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
????throws Exception {
????System.out.println("agr3:"+arg3);
????System.out.println("afterCompletion"+arg3.getMessage());
????}
}
? ? ? ? 4.2 在 SpringMVC.xml配置攔截器需要攔截哪些控制器
? ? ? ? 4.2.1 攔截所有控制器
?<!-- 攔截器 -->
<mvc:interceptors>
????<mvc:interceptor>
????????<bean class="com.chen.controller.DemoController"></bean>
????</mvc:interceptor>
</mvc:interceptors>
? ? ? ? 4.2.2 攔截特定的 url
????<!-- 攔截器 -->
????<mvc:interceptors>
????????<mvc:interceptor>
????????????<mvc:mapping path="/demo"/>
????????????<mvc:mapping path="/demo1"/>
????????????<mvc:mapping path="/demo2"/>
????????????<bean class="com.chen.controller.DemoController"></bean>
????</mvc:interceptor>
????</mvc:interceptors>
二 攔截器棧
? ?1. 多個攔截器同時生效時,組成攔截器棧
? ? 2.順序 先進后廚
? ? 3 執(zhí)行順序和在springmvc.xml 中配置順序有關
? ? preHandle(A) -> preHandle(B) -> 控制器方法 -> postHandle(B) ->postHanle(A) -> jsp -> afterCompletion(B)-> afterCompletion(A)
三 使用springmvc 攔截器實現(xiàn)登陸驗證
? ? 1 把頁面放到 web-inf中
? ? 2 放入到web-inf中后必須通過控制器轉發(fā)到頁面,springMVC 攔截器攔截的是控制器,不攔截jsp
? ? 2. 通過攔截器棧攔截全部控制器,需要在攔截器內部方形login控制器
controller
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
????String uri = req.getRequestURI();
????if(uri.equals("/springmvc03/login")){
????????return true;
????}else{
????Object obj = req.getSession().getAttribute("users");
????if(obj!=null){
????????eturn true;
????}
????res.sendRedirect("/springmvc03/login.jsp");
????????return false;
????}
}
? ??????
<!-- 配置攔截器 -->
<mvc:interceptors>
<bean class="com.chen.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>