一 自定義攔截器
? ? 1. 跟過(guò)濾器比較像的技術(shù)
? ? 2.發(fā)送請(qǐng)求時(shí)被攔截器攔截,在控制器前后添加額外功能
? ? ? ? 2.1 跟AOP 區(qū)分開(kāi)游桩,AOP 在特定方法前后擴(kuò)充(對(duì)ServiceImpl)
? ? ? ? 2.2 攔截器凌唬,請(qǐng)求攔截怔毛,針對(duì)點(diǎn)是控制器方法(對(duì)Controller)
????3. SpringMVC 攔截器 和 Filter的區(qū)別
? ? ? ? 3.1 攔截器只能攔截Controller
? ? ? ? 3.2 Filter可以攔截任何請(qǐng)求
????4. 實(shí)現(xiàn)自定義攔截器的步驟
? ? ? ? 4.1 新建類實(shí)現(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{
????//在進(jìn)入控制器之前執(zhí)行
????//如果返回值為false傀顾,阻止進(jìn)入控制器
????//控制代碼
????@Override
????public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
????????System.out.println("arg2:"+arg2);
????????System.out.println("preHandle");
????????return true;
????}
? ? //控制器執(zhí)行完成裳凸,進(jìn)入jsp之前執(zhí)行.
????//日志記錄
????//敏感詞語(yǔ)過(guò)濾
????@Override
????public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
????throws Exception {
????????System.out.println("往"+arg3.getViewName()+"跳轉(zhuǎn)");
????????System.out.println("model的值"+arg3.getModel().get("model"));
????????String word = arg3.getModel().get("model").toString();
????????String newWord = word.replace("祖國(guó)", "**");
????????arg3.getModel().put("model",newWord);
????????System.out.println("postHandle");
????}
????//jsp執(zhí)行完成后執(zhí)行
????//記錄執(zhí)行過(guò)程中出現(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. 多個(gè)攔截器同時(shí)生效時(shí),組成攔截器棧
? ? 2.順序 先進(jìn)后廚
? ? 3 執(zhí)行順序和在springmvc.xml 中配置順序有關(guān)
? ? preHandle(A) -> preHandle(B) -> 控制器方法 -> postHandle(B) ->postHanle(A) -> jsp -> afterCompletion(B)-> afterCompletion(A)
三 使用springmvc 攔截器實(shí)現(xiàn)登陸驗(yàn)證
? ? 1 把頁(yè)面放到 web-inf中
? ? 2 放入到web-inf中后必須通過(guò)控制器轉(zhuǎn)發(fā)到頁(yè)面,springMVC 攔截器攔截的是控制器缤至,不攔截jsp
? ? 2. 通過(guò)攔截器棧攔截全部控制器潮罪,需要在攔截器內(nèi)部方形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>