天天看點

SpringMVC 攔截器1.攔截器2.自定義攔截器3.多攔截器的應用

1.攔截器

Spring MVC 的攔截器類似于 Servlet  開發中的過濾器 Filter,用于對處理器進行預處理和後處理。

将攔截器按一定的順序聯結成一條鍊,這條鍊稱為攔截器鍊(Interceptor Chain)。在通路被攔截的方法或字段時,攔截器鍊中的攔截器就會按其之前定義的順序被調用。攔截器也是AOP思想的具體實作。

攔截器和過濾器的差別:

SpringMVC 攔截器1.攔截器2.自定義攔截器3.多攔截器的應用

2.自定義攔截器

自定義攔截器的三個步驟:

①建立攔截器類實作HandlerInterceptor接口 ②配置攔截器 ③測試攔截器的攔截效果

①建立攔截器類實作HandlerInterceptor接口

perHandler中的傳回值

如果是true:代表放行

如果傳回false,代表不放行,也就是後面的操作都不會執行。但是可以在噶方法裡面通過response轉發和重定向

package com.lsy.interceptor;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyInterceptor1 implements HandlerInterceptor {
    //在目标方法執行之前 執行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        System.out.println("preHandle.....");
        return true;
    }

    //在目标方法執行之後 視圖對象傳回之前執行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle...");
    }

    //在流程都執行完畢後 執行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion....");
    }
}
           

②在spring-mvc中配置攔截器

<!--    配置攔截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--表示對那些資源進行攔截操作-->
            <!--/**表示對所有的資源都進行攔截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.lsy.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
           

③測試攔截器的攔截效果

package com.lsy.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TargetController {

    @RequestMapping("/target")
    public ModelAndView show(){
        System.out.println("目标資源執行......");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name","itcast");
        modelAndView.setViewName("index");
        return modelAndView;
    }

}
           

浏覽器的通路位址:

SpringMVC 攔截器1.攔截器2.自定義攔截器3.多攔截器的應用
SpringMVC 攔截器1.攔截器2.自定義攔截器3.多攔截器的應用

preHandler方法的應用場景:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        System.out.println("preHandle.....");
        String param = request.getParameter("param");
        if("yes".equals(param)){
            return true;
        }else{
            request.getRequestDispatcher("/error.jsp").forward(request,response);
            return false;//傳回true代表放行  傳回false代表不放行
        }
    }
           

postHandler的應用場景:可以獲得視圖模型,并且進行修改。

//在目标方法執行之後 視圖對象傳回之前執行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        modelAndView.addObject("name","itheima");
        System.out.println("postHandle...");
    }
           

3.多攔截器的應用

package com.lsy.interceptor;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyInterceptor2 implements HandlerInterceptor {
    //在目标方法執行之前 執行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        System.out.println("preHandle22222.....");
        return true;
    }

    //在目标方法執行之後 視圖對象傳回之前執行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle2222...");
    }

    //在流程都執行完畢後 執行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion2222....");
    }
}
           
<!--    配置攔截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--表示對那些資源進行攔截操作-->
            <!--/**表示對所有的資源都進行攔截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.lsy.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <!--表示對那些資源進行攔截操作-->
            <!--/**表示對所有的資源都進行攔截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.lsy.interceptor.MyInterceptor2"></bean>
        </mvc:interceptor>

    </mvc:interceptors>
           
SpringMVC 攔截器1.攔截器2.自定義攔截器3.多攔截器的應用

先執行哪一個攔截器是有配置檔案決定的,先配置的是攔截器1就會先執行攔截器1的方法。

SpringMVC 攔截器1.攔截器2.自定義攔截器3.多攔截器的應用