SpringMVC 中的攔截器(HandlerInterceptor)

一、攔截器

1、概述
  • Spring MVC 的處理器攔截器類似於 Servlet 開發中的過濾器 Filter,用於對處理器進行預處理和後處理。用戶可以自己定義一些攔截器來實現特定的功能。
  • 它也是 AOP 思想的具體應用。
  • 我們要想自定義攔截器, 要求必須實現:HandlerInterceptor 接口。
2、攔截器鏈(Interceptor Chain)

攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。

3、SpringMVC攔截器 與 Servlet 中過濾器 Filter的區別
  • 過濾器是 servlet 規範中的一部分,任何 java web 工程都可以使用。
  • 攔截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
  • 過濾器在 url-pattern 中配置了/*之後,可以對所有要訪問的資源攔截。
  • 攔截器它是隻會攔截訪問的控制器方法,如果訪問的是 jsp,html,css,image 或者 js 是不會進行攔截的。

二、自定義攔截器

第一步:編寫一個普通類實現 HandlerInterceptor 接口
package cn.lemon.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在處理器方法執行前執行
        System.out.println("MyInterceptor 類中的 perHandle 方法,在處理器方法執行前執行.......");
        //return false;//當值爲 false 時,攔截器鏈中斷,不向下執行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //在處理器方法執行後執行
        System.out.println("MyInterceptor 類中的 postHandle 方法,在處理器方法執行後執行。。。。。。。。");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //在 view 跳轉後執行
        System.out.println("MyInterceptor 類中的 afterCompletion 方法,在 view 跳轉後執行");
    }
}
第二步:在 SpringMVC.xml 中配置攔截器
    <!--配置攔截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean id="myInterceptor" class="cn.lemon.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
第三步:測試
jsp 代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首頁</title>
</head>
<body>
<h4>異常測試</h4>
<a href="${pageContext.request.contextPath}/test/interceptor">點擊跳轉</a><br>
</body>
</html>
java 代碼
package cn.lemon.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/interceptor")
    public String interceptor() {
        System.out.println("Interceptor 執行。。。。");
        return "success";
    }
}

在這裏插入圖片描述

三、配置攔截器的作用範圍

在 SpringMVC.xml 中配置攔截器

    <!-- 配置攔截器的作用範圍 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" /><!-- 用於指定對攔截的 url -->
            <mvc:exclude-mapping path=""/><!-- 用於指定排除的 url-->
            <bean id="handlerInterceptorDemo1"
                  class="cn.lemon.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章