Spring MVC的攔截器

原文連接:http://www.yiidian.com/springmvc/interceptor.htmlhtml

Spring MVC中的攔截器(Interceptor)相似於Servlet中的過濾器(Filter),它主要用於攔截用戶請求並做相應的處理。例如經過攔截器能夠進行權限驗證、記錄請求信息的日誌、判斷用戶是否登陸等。java

要使用Spring MVC中的攔截器,就須要對攔截器類進行定義和配置。一般攔截器類能夠經過兩種方式來定義。web

經過實現HandlerInterceptor接口 繼承HandlerInterceptor接口的實現類(如:HandlerInterceptorAdapter)來定義。spring

1 編寫目標控制器

首先,爲了演示Spring MVC攔截器的效果,咱們先定義一個目標控制器session

HelloController目標控制器:mvc

package com.yiidian.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.UUID;

/**
 * 目標控制器
 * 一點教程網 - www.yiidian.com
 */
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String upload(HttpSession session, HttpServletResponse response) throws Exception {
        System.out.println("3.目標控制器-HelloController");
        return "success";
    }
}

2 編寫自定義攔截器

這裏咱們定義2個Spring MVC攔截器,並且這2個攔截器同時攔截器一個目標控制器,你們注意看最後的執行順序。app

Demo1Interceptor第一個攔截器:yii

package com.yiidian.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *  自定義攔截器
 *一點教程網 - www.yiidian.com
 */
public class Demo1Interceptor implements HandlerInterceptor{
    /**
     *preHandle: 在控制器(目標)的方法以前被執行
     *   返回值:控制afterCompletion方法是否被執行
     *       true: 執行afterCompletion
     *       false: 不執行afterCompletion
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1.Demo1Interceptor的preHandle");
        return true;
    }

    /**
     * postHandle: 在控制器(目標)的方法成功執行完成以後(注意:控制器方法失敗不執行)
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("5.Demo1Interceptor的postHandle");
    }

    /**
     *  afterCompletion: 在執行完前面全部(攔截器和目標)的方法以後執行(注意: 無論控制器方法執行成功與否都會被執行 )
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("7.Demo1Interceptor的afterCompletion");
    }
}

Demo2interceptor第二個攔截器:ide

package com.yiidian.interceptor;

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

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

/**
 *  自定義攔截器
 *一點教程網 - www.yiidian.com
 */
public class Demo2Interceptor implements HandlerInterceptor{
    /**
     *preHandle: 在控制器(目標)的方法以前被執行
     *   返回值:控制afterCompletion方法是否被執行
     *       true: 執行afterCompletion
     *       false: 不執行afterCompletion
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("2.Demo2Interceptor的preHandle");
        return true;
    }

    /**
     * postHandle: 在控制器(目標)的方法成功執行完成以後(注意:控制器方法失敗不執行)
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("4.Demo2Interceptor的postHandle");
    }

    /**
     *  afterCompletion: 在執行完前面全部(攔截器和目標)的方法以後執行(注意: 無論控制器方法執行成功與否都會被執行 )
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("6.Demo2Interceptor的afterCompletion");
    }
}

注意:一個攔截器和多個攔截器的執行順序看下圖。post

一個攔截器的執行順序:

file

多個攔截器的執行順序:

file

3 springmvc.xml配置攔截器

<!-- 配置攔截器 -->
<mvc:interceptors>
    <!-- 配置2個攔截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean class="com.yiidian.interceptor.Demo1Interceptor"/>
    </mvc:interceptor>

    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean class="com.yiidian.interceptor.Demo2Interceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

注意:攔截器配置的順序決定了攔截器的執行順序,先配置會先被執行!

4 運行測試

訪問:http://localhost:8080/hello

控制檯輸出效果以下:

file

源碼下載:https://pan.baidu.com/s/1myzqCpvlhVb4aJkb5aucdQ

file

歡迎關注個人公衆號::一點教程。得到獨家整理的學習資源和平常乾貨推送。 若是您對個人系列教程感興趣,也能夠關注個人網站:yiidian.com

相關文章
相關標籤/搜索