天天看點

SpringMVC架構中的攔截器

1. 攔截器的概述

  1. SpringMVC架構中的攔截器用于對處理器進行預處理和後處理的技術。
  2. 可以定義攔截器鍊,連接配接器鍊就是将攔截器按着一定的順序結成一條鍊,在通路被攔截的方法時,攔截器鍊中的攔截器會按着定義的順序執行。
  3. 攔截器和過濾器的功能比較類似,有差別
    1. 過濾器是Servlet規範的一部分,任何架構都可以使用過濾器技術。
    2. 攔截器是SpringMVC架構獨有的。
    3. 過濾器配置了/*,可以攔截任何資源。
    4. 攔截器隻會對控制器中的方法進行攔截。
  4. 攔截器也是AOP思想的一種實作方式
  5. 想要自定義攔截器,需要實作HandlerInterceptor接口。

 2. 自定義攔截器步驟

controller中的方法

* 測試攔截器
 */
@Controller
@RequestMapping("/dept")
public class DeptController {
​
    /**
     * 測試方法
     * @return
     */
    @RequestMapping("/findAll.do")
    public String findAll(){
​
        System.out.println("controller方法執行了...");
​
        return "suc";
    }
​
}
           

建立類,實作HandlerInterceptor接口,重寫需要的方法

* 攔截器類
 */
public class MyInterceptor2 implements HandlerInterceptor{
​
    /**
     * 攔截controller中方法。放行了,執行controller中方法。
     * return true 方向
     * return false 攔截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("攔截器preHandle方法執行了...");
        // 手動跳轉頁面
        // request.getRequestDispatcher("/index.jsp").forward(request,response);
        // 攔截,不放行
        //return false;
        // 放行
        return true;
    }
​
}
           

在springmvc.xml中配置攔截器類

<!--配置攔截器們-->
    <mvc:interceptors>
        <!--配置攔截器-->
        <mvc:interceptor>
            <!--該攔截器攔截哪些資源-->
            <mvc:mapping path="/dept/**"/>
            <!--哪些資源不想攔截
            <mvc:exclude-mapping path="" />
            -->
            <!--攔截器對象-->
            <bean class="cn.tx.demo4.MyInterceptor2" />
        </mvc:interceptor>
    </mvc:interceptors>
           

3. HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法執行前攔截的方法
    1. 可以使用request或者response跳轉到指定的頁面
    2. return true放行,執行下一個攔截器,如果沒有攔截器,執行controller中的方法。
    3. return false不放行,不會執行controller中的方法。
  2. postHandle是controller方法執行後執行的方法,在JSP視圖執行前。
    1. 可以使用request或者response跳轉到指定的頁面
    2. 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面将不會顯示。
  3. postHandle方法是在JSP執行後執行
    1. request或者response不能再跳轉頁面了
* 攔截器類
 */
public class MyInterceptor2 implements HandlerInterceptor{
​
    /**
     * 攔截controller中方法。放行了,執行controller中方法。
     * return true 方向
     * return false 攔截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("攔截器preHandle方法執行了...");
        // 手動跳轉頁面
        // request.getRequestDispatcher("/index.jsp").forward(request,response);
        // 攔截,不放行
        //return false;
        // 放行
        return true;
    }
​
    /**
     * controller方法執行後,要攔截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法執行了...");
        // 也是可以進行頁面的跳轉
        request.getRequestDispatcher("/index.jsp").forward(request,response);
        return;
    }
​
    /**
     * controller跳轉的jsp頁面都執行完成了,最後執行該方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法執行了...");
    }
​
}
​
           

3. 配置多個攔截器

再編寫一個攔截器的類

* 攔截器類
 */
public class MyInterceptor3 implements HandlerInterceptor{
​
    /**
     * 攔截controller中方法。放行了,執行controller中方法。
     * return true 方向
     * return false 攔截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor3的preHandle方法執行了...");
        // 放行
        return true;
    }
​
    /**
     * controller方法執行後,要攔截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor3的postHandle方法執行了...");
    }
​
    /**
     * controller跳轉的jsp頁面都執行完成了,最後執行該方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor3的afterCompletion方法執行了...");
    }
​
}
​
           

配置2個攔截器

<!--配置攔截器們-->
    <mvc:interceptors>
        <!--配置攔截器-->
        <mvc:interceptor>
            <!--該攔截器攔截哪些資源-->
            <mvc:mapping path="/dept/**"/>
            <!--哪些資源不想攔截
            <mvc:exclude-mapping path="" />
            -->
            <!--攔截器對象-->
            <bean class="cn.tx.demo4.MyInterceptor2" />
        </mvc:interceptor>
​
        <!--配置攔截器-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.tx.demo4.MyInterceptor3" />
        </mvc:interceptor>
    </mvc:interceptors>
           

繼續閱讀