1. 程式人生 > >【SpringBoot】RESTful API攔截-過濾器、攔截器、切片

【SpringBoot】RESTful API攔截-過濾器、攔截器、切片

前言

這裡瞭解一下restful api的攔截,文字主要介紹三種方式來對api進行攔截,參考本文可實現攔截api,進行一些附加操作,比如列印攔截到的方法所在類名,獲取原始的request,攔截到api的呼叫的方法名,還可以根據需要實現打印出方法的引數。當然,下面介紹的攔截器、過濾器、切片功能不全一樣,側重點不同。希望可以給大家帶來幫助。

應用

過濾器方式實現攔截

1、自定義過濾器:

/**
 * @author: zhoulitong
 * @date: 2018/4/23
 * @description:
 */
@Component
public class TimeFilter
implements Filter {
@Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("time filter init"); } /** * 處理服務的請求時間 * @param request * @param response * @param chain * @throws IOException * @throws ServletException */
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //System.out.println("time filter start"); long start = System.currentTimeMillis(); chain.doFilter(request,response); //System.out.println("time filter 耗時:" + (System.currentTimeMillis() - start));
//System.out.println("time filter finish"); } @Override public void destroy() { //System.out.println("time filter destroy"); } }

2、配置過濾器注入到spring容器:

/**
 * @author: zhoulitong
 * @date: 2018/4/23
 * @description: 
 */
@Configuration
public class WebConfig{
    @Bean
    public FilterRegistrationBean timeFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        TimeFilter timeFilter = new TimeFilter();
        registrationBean.setFilter(timeFilter);

        List<String> urls = new ArrayList<>();
        //此過濾器在以下url中會起作用
        urls.add("/*");
        registrationBean.setUrlPatterns(urls);
        return registrationBean;
    }
}

3、特點:此種方式配置可以實現自定義過濾URL的操作,不可從request中拿到

攔截器方式實現攔截

1、自定義攔截器:

/**
 * @author: zhoulitong
 * @date: 2018/4/23
 * @description: preHandle在控制器方法呼叫之前執行,postHandle在控制器方法正常執行後執行,afterCompletion不管控制器方法執行成功與否,都會執行;攔截器優於過濾器的地方就是攔截器有handler這個引數可以瞭解到針對哪個具體的方法進行了攔截。
 */
@Component
public class TimeInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        //列印類名
        System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
        //列印方法名
        System.out.println(((HandlerMethod)handler).getMethod().getName());
        request.setAttribute("startTime",System.currentTimeMillis());
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
        Long start = (Long)request.getAttribute("startTime");
        System.out.println("time intercept 耗時:" + (System.currentTimeMillis() - start));
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception ex) throws Exception {
        System.out.println("afterCompletion");
        Long start = (Long)request.getAttribute("startTime");
        System.out.println("time intercept 耗時:" + (System.currentTimeMillis() - start));
        System.out.println("ex is" + ex);
    }
}

2、配置攔截器注入到spring容器(配置類需要繼承WebMvcConfigurerAdapter,重寫addInterceptors,手動新增自定義攔截器來到達注入的目的),也可為非同步請求加入攔截器

/**
 * @author: zhoulitong
 * @date: 2018/4/23
 * @description: 配置TimeInterceptor需要extends WebMvcConfigurerAdapter
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private TimeInterceptor timeInterceptor;

    /**
     * 針對非同步的攔截器配置,攔截非同步請求
     * @param configurer
     */
    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        super.configureAsyncSupport(configurer);
        //比如如下給非同步服務請求新增攔截器
        //configurer.registerCallableInterceptors((CallableProcessingInterceptor) timeInterceptor);
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor);
    }
}

3、特點:此種方式可以獲取到攔截的類名稱、方法名稱,不能獲取到方法引數,原因是在dispatcherservlet原始碼中,經過preHandle才對方法引數通過request裡面開始處理拼接)

切片方式實現攔截

1、自定義切片:

@Aspect
@Component
public class TimeAspect {
    //切入點
    @Around("execution(* com.zlt.web.controller.UserController.*(..))")
    //增強
    public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {

            System.out.print("time aspect start");
            Object[] args = pjp.getArgs();
            for (Object arg :args){
            System.out.println("arg is" + arg);
            }
            long start = System.currentTimeMillis();
            //呼叫被攔截的方法
            Object object = pjp.proceed();
            System.out.println("time filter 耗時:" + (System.currentTimeMillis() - start));
            System.out.println("time aspect end");
            return object; 
    }
}

2、特點:可以攔截到類名、方法名,方法引數名

小結

區別:

過濾器:可以拿到原始的HTTP請求和響應資訊,拿不到處理請求的方法值資訊
攔截器:既可以拿到HTTP請求和響應資訊,也可以拿到請求的方法資訊,拿不到方法呼叫的引數值資訊
切片:可以拿到請求方法的傳入引數值,拿不到原始的HTTP請求和響應的物件

發起一個請求,若三者共存的情況下:

正常執行順序為:filter-interceptor-aspect
異常情況下:aspect-interceptor-filter

相關推薦

SpringBootRESTful API攔截-過濾器攔截切片

前言 這裡瞭解一下restful api的攔截,文字主要介紹三種方式來對api進行攔截,參考本文可實現攔截api,進行一些附加操作,比如列印攔截到的方法所在類名,獲取原始的request,攔截到api

轉載RESTful API 最佳實踐

作者: 阮一峰 日期: 2018年10月 3日 RESTful 是目前最流行的 API 設計規範,用於 Web 資料介面的設計。 它的大原則容易把握,但是細節不容易做對。本文總結 RESTful 的設計細節,介紹如何設計出易於理解和使用的 API。

API設計RESTful API 設計指南

sys i/o ani sta 所有 com 訪問 指定 名詞 RESTful API URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。 例如 1. REST描述的是在網絡中client和server的一種交互形式;REST本身不實

Django Restful Framework第四篇版本解析序列化和請求數據驗證

tor ade clu cts scheme com 繼承 src 當前 一、版本 程序也來越大時,可能通過版本不同做不同的處理 沒用rest_framework之前,我們可以通過以下這樣的方式去獲取。 class UserView(APIView): def

SpringBoot攔截使用@Autowired註入接口為null解決方法

res 自定義 row 攔截 request spa mvcc gist private 最近使用SpringBoot的自定義攔截器,在攔截器中註入了一個DAO,準備下面作相應操作,攔截器代碼: public class TokenInterceptor implemen

原始碼宣告32位和64位AccessExcel等VBA相容的API函式的方法

1.在宣告中加上  PtrSafe 關鍵字2.加上VBA7 及Win64的判斷 Declare 語句 PtrSafe 關鍵字(可參考VBA幫助)帶有 PtrSafe 關鍵字的 Declare 語句為建議的語法。要使包括 PtrSafe 的 Declare 語句能同時在 32 位和

springboot零基礎快速入門springboot2.0.6

1、springboot2.X 課程全套介紹和高手系列知識點 簡介:介紹Springboot2.x課程大綱章節 java基礎,jdk環境,maven基礎 2、Springboot2.x依賴環境和版本新特性說明 簡介:講解新版本依賴環境和Springboot2.x新特性概述 1、依賴版

springboot5SpingBoot檔案上傳多檔案上傳檔案下載(斷點續傳)

檔案上傳 SpringBoot的檔案上傳相對比較簡單,檔案資訊都包含在MultipartFile物件中,只要從中獲取檔案資訊即可 不煽情,直接上程式碼吧,這個部分出門右拐“百度一下”一大堆 /** * 單檔案上傳 * * @param name 攜帶的其他文字表單(可以

springboot2Controller和引數

類上的配置 @RestController public class SpringdemoApplication { ... } 其中@RestController表示返回string或者json內容(即直接返回內容),而如果是@Controller則表示可以返回

springboot3Spring Boot+Mybatis

依賴配置 結合前面的內容,這裡我們要嵌入資料庫的操作,這裡以操作mysql為例整合Mybatis,首先需要在原來的基礎上新增以下依賴 <!-- mybatis依賴 --> <dependency> <groupId>org.my

springboot4SpringBoot+Mybatis多表操作以及增刪改查

Mybatis整合成功之後,接下來了解一下增刪改查的配置以及多表操作,先從增刪改查開始 為了方便後面的多表操作,現在針對資料表的配置我這裡全部在xml中配置(暫時不用註解的方式了),先看一下目前的工程結構(注意包名) 首先為了瞭解增刪改查的操作,我這裡將針對資料庫中的一個文

SpringBoot過濾器配置

package com.construn.procure.common; import org.springframework.beans.factory.annotation.Autowired;

SpringBoot攔截使用@Autowired注入介面為null解決方法

public class TokenInterceptor implements HandlerInterceptor { @Autowired private ITokenDao tokenDao; @Override public

RESTfulRESTful API 設計規範

概念 本質:一種軟體架構風格 核心:面向資源設計的API 解決問題: 降低開發的複雜性 提高系統的可伸縮性 例如:設計一套API,為多個終端服務。 設計概念和準則 網路上的所有事物都可以被抽象為資源 每一個資源都有唯一的資源標識,對資源的操作不會改變這些標

RESTfulRESTful API 介面設計規範 | 示例

概念 本質:一種軟體架構風格 核心:面向資源設計的API 解決問題: 降低開發的複雜性 提高系統的可伸縮性 例如:設計一套API,為多個終端服務。 設計概念和準則 網路上的所有事物都可以被抽象為資源 每一個資源都有唯一的資源標識,

SpringBoot 中時間型別 序列化反序列化格式處理

# 【SpringBoot】 中時間型別 序列化、反序列化、格式處理 ## Date **yml全域性配置** ```yaml spring: jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss #配置POST請求

ServletJava Servet Filter 過濾器

退出方法 efi rlogin file submit ati 姓名 ner lan Filter的設計思想Filter是一種AOP的設計思想 : 面向切面下面這是一個使用filter的登錄案例:我們通過一張圖片理解理解filer面向切面下面是項目的結構:下面是jsp文件:

Web API 方法的返回類型格式過濾器

lca asc .net nbsp tin 過濾 col 數據 www 一、Action方法的返回類型 a) 操作方法的返回類型有四種:void、簡單或復雜類型、HttpResponseMessage類型、IHttpActionResult類型。 b) 如果返回類型為voi

前端react學習階段總結,學習reactreact-router與redux的這些事兒

行程 clas 目前 webpack body src 控制 return 體驗 前言   借用阮一峰的一句話:真正學會 React 是一個漫長的過程。 這句話在我接觸react深入以後,更有感觸了。整個react體系都是全新的,最初做簡單的應用,僅僅使用react-to

springboot之starter pom

soc jet rep uri shel mvc must batch god SpringBoot針對不同業務提供了不同的starter pom,根據springboot版本不同可能有差異。 spring-boot-starter springboot核心start