spring boot RESTFul API攔截 以及Filter和interceptor 、Aspect區別
今天學習一下RESTFul api攔截
大概有三種方式
過濾器(Filter) :可以拿到原始的http請求,但是拿不到你請求的控制器和請求控制器中的方法的資訊。
攔截器(Interceptor):可以拿到你請求的控制器和方法,卻拿不到請求方法的引數。
切片 (Aspect) : 可以拿到方法的引數,但是卻拿不到http請求和響應的物件
一、通過Filter這個大家很熟悉了吧,這是java規範的一個過濾器,他會攔截請求。在springboot中一般有兩種配置方式。
這種過濾器攔截並不知道你用的是哪一個Controller處理也不知道你用哪一個方法處理。
(1)第一種直接寫類實現這個介面。程式碼如下這個要使用Component註解,當你你請求伺服器的時候他會對每一個請求進行處理。
package com.nbkj.webFilter; import org.springframework.stereotype.Component; import javax.servlet.*; import java.io.IOException; import java.util.Date; @Component public class TimerFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Time filter init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Time filter start"); long startTime = new Date().getTime(); filterChain.doFilter(servletRequest, servletResponse); System.out.println("time filter:"+(new Date().getTime()-startTime)); System.out.println("time filter finish"); } @Override public void destroy() { System.out.println("Time filter destroy"); } }
(2)第二種可以在WebConfig中配置,這種配置方式為了使用第三方的Filter沒有@Compont註解所以使用。程式碼如下
package com.nbkj.config; import com.nbkj.webFilter.TimerFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * Web配置 * * @author hsj * @Configuration 這個註解宣告這個類是配置類 * @create 2017-11-11 18:00 **/ @Configuration public class WebConfig { @Bean public FilterRegistrationBean timeFilter() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); TimerFilter timerFilter = new TimerFilter(); registrationBean.setFilter(timerFilter); List<String> urls = new ArrayList<>(); urls.add("/*"); registrationBean.setUrlPatterns(urls); return registrationBean; } }
二、使用Interceptor這種事spring框架自己帶的攔截器,程式碼如下 它會處理自己寫的攔截器,也會攔截的攔截BasicErrorController
可以拿到處理的Controller和拿到處理的方法 但是拿不到具體的請求引數。
package com.nbkj.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.persistence.Convert;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* this is spring interceptor
*
* @author hsj
* @create 2017-11-11 18:16
**/
@Component
public class TimeInterceptor implements HandlerInterceptor {
/**
* 控制器方法處理之前
*
* @param httpServletRequest
* @param httpServletResponse
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
System.out.println("preHandle");
System.out.println(((HandlerMethod) handler).getBean().getClass().getName());
System.out.println(((HandlerMethod) handler).getMethod().getName());
httpServletRequest.setAttribute("startTime", new Date().getTime());
return false;
}
/**
* 控制器方法處理之後
* 控制器方法呼叫不拋異常呼叫
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
Long startTime = (Long) httpServletRequest.getAttribute("startTime");
System.out.println("time interceptor 耗時" + (new Date().getTime() - startTime));
}
/**
* 控制器方法拋不拋異常都會被呼叫
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion");
Long startTime = (Long) httpServletRequest.getAttribute("startTime");
System.out.println("time interceptor 耗時" + (new Date().getTime() - startTime));
System.out.println("ex is" + e);
}
}
package com.nbkj.config;
import com.nbkj.interceptor.TimeInterceptor;
import com.nbkj.webFilter.TimerFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* Web配置
*
* @author hsj
* @Configuration 這個註解宣告這個類是配置類
* @create 2017-11-11 18:00
**/
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}
}
三、使用Aspect切片,程式碼如下
使用環繞通知,切入要切入的類,當請求的時候回攔截下來,這樣可以獲取攔截的方法的引數
package com.nbkj.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* this is a acpect
* 切入點
* 在那些方法上起作用
* 在什麼時候起作用
*
* @author hsj
* @create 2017-11-11 20:52
**/
@Aspect
@Component
public class TimeAspect {
@Around("execution(* com.nbkj.controller.UserController.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("time aspect start");
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
System.out.println(arg.getClass().getName());
System.out.println("arg is " + arg);
}
long startTime = new Date().getTime();
Object obj = proceedingJoinPoint.proceed();
System.out.println("time aspect 耗時" + (new Date().getTime() - startTime));
System.out.println("time aspect end");
return obj;
}
}
相關推薦
spring boot RESTFul API攔截 以及Filter和interceptor 、Aspect區別
今天學習一下RESTFul api攔截 大概有三種方式 過濾器(Filter) :可以拿到原始的http請求,但是拿不到你請求的控制器和請求控制器中的方法的資訊。 攔截器(Interceptor):可以拿到你請求的控制器和方法,卻
spring boot 攔截 以及Filter和interceptor 、Aspect區別
spring boot 攔截 以及Filter和interceptor 、Aspect區別 今天學習一下RESTFul api攔截 大概有三種方式
spring boot restful api 方法引數 BindException 異常處理
客戶端 post json 資料,api 方法 接收的引數綁定出現異常,丟擲 BindException 異常,可以按照如下的方式處理 1、方法引數中增加 BindingResult 引數,通過 bindingResult.hasErrors()
一個基於Spring Boot的API、RESTful API項目種子(骨架)
工具 form enum 環境 mov 輸入 排除 規則 簡單的 前言最近使用Spring Boot 配合 MyBatis 、通用Mapper插件、PageHelper分頁插件 連做了幾個中小型API項目,做下來覺得這套框架、工具搭配起來開發這種項目確實非常舒服,團隊的反響
一個基於Spring Boot的API、RESTful API專案種子(骨架)
前言 最近使用Spring Boot 配合 MyBatis 、通用Mapper外掛、PageHelper分頁外掛 連做了幾個中小型API專案,做下來覺得這套框架、工具搭配起來開發這種專案確實非常舒服,團隊的反響也不錯。在專案搭建和開發的過程中也總結了一些小經驗,與大家分享一下。
Spring boot 靜態資源處理以及攔截器的使用
前言 本章主要圍繞WebMvcConfigurer,簡單介紹spring boot如何處理靜態資源以及使用攔截器的使用 靜態資源 spring boot預設為我們提供預設的配置方式 classpath:/META-INF/resources classpath
spring boot使用aop攔截Controller和Service以方便除錯
除錯的時候,經常需要看每個函式的輸入輸出,以前每次都是System.out.println輸出,除錯完後還要刪掉,要是每次都能自己輸出函式的輸入輸出就好了。 在網上找了一通,結合《Spring 實戰》寫了一個自己用的切面 BaseAspect public abst
Spring-Boot -- RESTFUL風格的API介面的三種呼叫方式【測試】
專案目錄結構圖: 說明:博主所有基於學習的內容全部基於上圖中的Spring-Boot框架,專案暫時不會上傳,因為還在完善,而且內容都比較離散,都是學習中遇到哪個知識點就往裡面加,因此,我只拆分
一個基於Spring Boot的API、RESTful API專案
最近使用Spring Boot 配合 MyBatis 、通用Mapper外掛、PageHelper分頁外掛 連做了幾個中小型API專案,做下來覺得這套框架、工具搭配起來開發這種專案確實非常舒服,團隊的反響也不錯。在專案搭建和開發的過程中也總結了一些小經驗,與大家分享一下。
Spring Boot自定義攔截器和轉換器
Spring Boot自定義攔截器和轉換器 自定義的攔截器要實現HandlerInterceptor介面,並且要將攔截器新增到Spring Boot容器中 1、使用者登陸校驗攔截器 攔截器: /** * 判斷使用者是否登陸的攔截器 * Created by Adminis
Spring Boot Restful WebAPI集成 OAuth2
for 配置 depend http factor detail sso ide cli 系統采用前後端分離的架構,采用OAuth2協議是很自然的事情。 下面開始實戰,主要依賴以下兩個組件: <dependency> <groupId>org.s
spring boot 1.5.4 定時任務和異步調用(十)
springboot springboot1.5.4 springboot之web開發 springboot定時任務 springboot異步回調 上一篇:spring boot1.5.4 統一異常處理(九) 1 Spring Boot定時任務和異步調用我們在編寫Spring B
【spring Boot】2.在Myecplise上把spring Boot項目打包 war包和jar包
aps let failed htm 報錯 聲明 執行 spa oss ========================================================第一部分=========================================
【第四十章】Spring Boot 自定義攔截器
ram obj pre .config factor ati bean configure 邏輯 1.首先編寫攔截器代碼 package com.sarnath.interceptor; import javax.servlet.http.HttpServlet
spring-boot restful put方式提交表單
project 代碼 pin bsp app utm oot request print 使用spring-boot 做接口,如果按restful的路由形式想使用put方式進行表單提交,第一個參數應該為文件參數,代碼如下: @PutMapping("/http-put
Spring Boot實戰:攔截器與過濾器
www container extends post 代理 init 切面 請求 一個 一、攔截器與過濾器 在講Spring boot之前,我們先了解一下過濾器和攔截器。這兩者在功能方面很類似,但是在具體技術實現方面,差距還是比較大的。在分析兩者的區別之前,
初學者建立spring-boot工程,返回靜態頁面和非同步資料
本人基於idea建立 以上步驟就基於idea建立了一個簡單的spring-boot專案,【idea對於一些外掛做了封裝,效能較好】 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://m
Spring Boot (二):Redis和日誌
接著上篇內容繼續往下執行。 首先pom.xml 新增redis的引用,因為開始建專案沒有,自動生成redis的引用,然後手動新增進去。 新增成功以後看我們的配置檔案 新增我們的日誌類和快取 快取方法 結果: http://localhost:8080/set?key=lxh2&
Spring boot 配置檔案詳解 (properties 和yml )
從其他框架來看 我們都有自己的配置檔案, hibernate有hbm,mybatis 有properties, 同樣, Spring boot 也有全域性配置檔案。 Springboot使用一個全域性的配置檔案,而且配置檔案的名字是固定的。 有兩種 application.properties
Spring Boot +Mybatis 多資料來源的配置和使用
1、在application.properties中新增資料庫連線配置 mybatis.type-aliases-package=com.yc.edusys.bean mybatis.mapper-locations=cla