1. 程式人生 > 其它 >SpringMVC中的攔截器

SpringMVC中的攔截器

技術標籤:SpringMVCSpringMVC中的攔截器

SpringMVC中的攔截器

攔截器的作用

SpringMVX中的攔截器類似於Servlet中的過濾器Filter,用於對處理器進行預處理和後處理
談到攔截器,還要提一個詞——攔截器鏈(Interceptor
Chain)。攔截器鏈就是將攔截器按一定順序聯結成一條鏈。在訪問被攔截的方法和欄位之時,攔截器鏈中的攔截器就會按其之前定義的順序被呼叫
攔截器預過濾器的區別:

  • 過濾器是servlet規範中的一部分,任何java web工程都可以用
  • 攔截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 過濾器在url-patten 中配置 /*之後,可以對所有要訪問的資源進行攔截。
  • 攔截器只會攔截訪問的控制器的方法,如果訪問的是 jsp、html、css、image或者js是不會進行攔截的
  • 細節:他也是AOP思想的具體應用
  • 想要自定義攔截器,必須要求實現:HandlerInterceptor介面

在這裡插入圖片描述

編寫攔截器類

package com.wl.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

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

/**
 * 自定義攔截器
 */
public class MyInterceptor1 implements HandlerInterceptor { //預處理,Controller方法執行前 //return true 放行,執行下一個攔截器,如果沒有,執行controller中的方法 //return false 不放行, @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.
out.println("MyInterceptor1執行了..."); return true; } }

springmvc.xml

<!--配置攔截器-->
    <mvc:interceptors>
        <!--配置攔截器-->
        <mvc:interceptor>
            <!--你要攔截的具體的方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要攔截的方法-->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置攔截器物件-->
            <bean class="com.wl.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>

測試

在這裡插入圖片描述

攔截器中的方法

preHandle:是controller方法執行之前攔截的方法

  1. 可以使用request或者response跳轉到指定頁面
  2. return true放行,執行下一個攔截器,如果沒有攔截器,則直接執行controller中的方法
  3. return false 不放行,不會執行controller中的方法

postHandle:是controller方法執行執行的方法,在JSP檢視執行前

  1. 可以使用request或者response跳轉到指定頁面
  2. 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面將不會顯示
package com.wl.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 MyInterceptor1 implements HandlerInterceptor {

    //預處理,Controller方法執行前
    //return true 放行,執行下一個攔截器,如果沒有,執行controller中的方法
    //return false 不放行,
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1執行了...前");
        //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        return true;
    }

    //後處理方法,controller方法執行後,success.jsp執行之前
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1執行了...後");
        //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
    }

    //success.jsp頁面執行後,該方法會執行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1執行了...最後");
    }
}