日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot攔截器如何獲取http請求參數

瀏覽:111日期:2023-04-27 08:17:29

1.1、獲取http請求參數是一種剛需

我想有的小伙伴肯定有過獲取http請求的需要,比如想

前置獲取參數,統計請求數據 做服務的接口簽名校驗 敏感接口監控日志 敏感接口防重復提交

等等各式各樣的場景,這時你就需要獲取 HTTP 請求的參數或者請求body,一般思路有兩種,一種就是自定義個AOP去攔截目標方法,第二種就是使用攔截器。整體比較來說,使用攔截器更靈活些,因為每個接口的請求參數定義不同,使用AOP很難細粒度的獲取到變量參數,本文主線是采用攔截器來獲取HTTP請求。

1.2、定義攔截器獲取請求

基于 spring-boot-starter-parent 2.1.9.RELEASE

看起來這個很簡單,這里就直接上code,定義個攔截器

/** * @author axin * @summary HTTP請求攔截器 */@Slf4jpublic class RequestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //獲取請求參數 String queryString = request.getQueryString(); log.info('請求參數:{}', queryString); //獲取請求body byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream()); String body = new String(bodyBytes, request.getCharacterEncoding()); log.info('請求體:{}', body); return true; }}

然后把這個攔截器配置一下中:

/** * WebMVC配置,你可以集中在這里配置攔截器、過濾器、靜態資源緩存等 */@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestInterceptor()).addPathPatterns('/**'); }}

定義個接口測試一下

/** * @author axin * @summary 提交測試接口 */@Slf4j@RestControllerpublic class MyHTTPController { @GetMapping('/v1/get') public void get(@RequestParam('one') String one, @RequestParam('two') BigDecimal number) { log.info('參數:{},{}', one, number); } @PostMapping('/v1/post') public void check(@RequestBody User user) { log.info('{}', JSON.toJSONString(user)); }}

GET請求獲取請求參數示例:

SpringBoot攔截器如何獲取http請求參數

POST請求獲取請求Body示例:

SpringBoot攔截器如何獲取http請求參數

我們發現攔截器在獲取HTTP請求的body時出現了 400 (Required request body is missing: public void com.axin.world.controller.MyHTTPController.check(com.axin.world.domain.User));同時也發現攔截器竟然走了兩遍,這又是咋回事呢?

SpringBoot攔截器如何獲取http請求參數

1.3、為什么攔截器會重復調兩遍呢?

其實是因為 tomcat截取到異常后就轉發到/error頁面,就在這個轉發的過程中導致了springmvc重新開始DispatcherServlet的整個流程,所以攔截器執行了兩次,我們可以看下第二次調用時的url路徑:

SpringBoot攔截器如何獲取http請求參數

1.4、ServletInputStream(CoyoteInputStream) 輸入流無法重復調用

而之前出現的 Required request body is missing 錯誤 其實是ServletInputStream被讀取后無法第二次再讀取了,所以我們要把讀取過的內容存下來,然后需要的時候對外提供可被重復讀取的ByteArrayInputStream。

對于MVC的過濾器來說,我們就需要重寫 ServletInputStream 的 getInputStream()方法。

1.5、自定義 HttpServletRequestWrapper

為了 重寫 ServletInputStream 的 getInputStream()方法,我們需要自定義一個 HttpServletRequestWrapper :

/*** @author Axin* @summary 自定義 HttpServletRequestWrapper 來包裝輸入流*/public class AxinHttpServletRequestWrapper extends HttpServletRequestWrapper { /** * 緩存下來的HTTP body */ private byte[] body; public AxinHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); body = StreamUtils.copyToByteArray(request.getInputStream()); } /** * 重新包裝輸入流 * @return * @throws IOException */ @Override public ServletInputStream getInputStream() throws IOException { InputStream bodyStream = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException {return bodyStream.read(); } /** * 下面的方法一般情況下不會被使用,如果你引入了一些需要使用ServletInputStream的外部組件,可以重點關注一下。 * @return */ @Override public boolean isFinished() {return false; } @Override public boolean isReady() {return true; } @Override public void setReadListener(ReadListener readListener) { } }; } @Override public BufferedReader getReader() throws IOException { InputStream bodyStream = new ByteArrayInputStream(body); return new BufferedReader(new InputStreamReader(getInputStream())); }}

然后定義一個 DispatcherServlet子類來分派 上面自定義的 AxinHttpServletRequestWrapper :

/*** @author Axin* @summary 自定義 DispatcherServlet 來分派 AxinHttpServletRequestWrapper*/public class AxinDispatcherServlet extends DispatcherServlet { /** * 包裝成我們自定義的request * @param request * @param response * @throws Exception */ @Override protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { super.doDispatch(new AxinHttpServletRequestWrapper(request), response); }}

然后配置一下:

/** * WebMVC配置,你可以集中在這里配置攔截器、過濾器、靜態資源緩存等 */@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestInterceptor()).addPathPatterns('/**'); } @Bean @Qualifier(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServlet dispatcherServlet() { return new AxinDispatcherServlet(); }}

再調用一下 POST請求:

SpringBoot攔截器如何獲取http請求參數

請求成功!

1.5、總結一下 展望一下

如果你想對HTTP請求做些騷操作,那么前置獲取HTTP請求參數是前提,為此文本給出了使用MVC攔截器獲取參數的樣例。

在獲取HTTP Body 的時候,出現了 Required request body is missing 的錯誤,同時攔截器還出現執行了兩遍的問題,這是因為 ServletInputStream被讀取了兩遍導致的,tomcat截取到異常后就轉發到 /error 頁面 被攔截器攔截到了,攔截器也就執行了兩遍。

為此我們通過自定義 HttpServletRequestWrapper 來包裝一個可被重讀讀取的輸入流,來達到期望的攔截效果。

在獲取到HTTP的請求參數后,我們可以前置做很多操作,比如常用的服務端接口簽名驗證,敏感接口防重復請求等等。

個人水平有限,如果文章有邏輯錯誤或表述問題還請指出,歡迎一起交流。

到此這篇關于SpringBoot攔截器如何獲取http請求參數的文章就介紹到這了,更多相關SpringBoot攔截器獲取http請求參數內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产九一精品| 伊人久久成人| 亚洲制服少妇| 99精品美女| 正在播放日韩精品| 欧美日韩视频网站| 国产在线看片免费视频在线观看| 国产精品videossex久久发布| 日韩二区在线观看| 日本不卡不码高清免费观看| 最新国产精品| 久久wwww| 日韩不卡视频在线观看| 欧美丰满日韩| 欧美 日韩 国产精品免费观看| 欧美中文日韩| 青青国产精品| 在线人成日本视频| 中文在线不卡| 欧美精品中文字幕亚洲专区| 精品伊人久久久| re久久精品视频| 日韩精品视频中文字幕| 欧美激情福利| 性欧美69xoxoxoxo| 一区二区电影在线观看| 久久久国产精品网站| 成人福利av| 视频一区在线播放| 卡一卡二国产精品| 午夜欧美视频| 欧美黑人做爰爽爽爽| 一区免费视频| 精品国产a一区二区三区v免费| 亚洲精品一二三区区别| 国产美女精品视频免费播放软件| 深夜视频一区二区| 欧美片网站免费| 久久成人精品| 日韩av福利| 亚洲三级视频| 亚洲性色视频| 精品国产麻豆| 色狠狠一区二区三区| 丁香六月综合| 国产精品v日韩精品v欧美精品网站 | 婷婷亚洲成人| 欧美亚洲国产激情| 精品一区二区三区免费看| 亚洲精品大全| 香蕉成人久久| 亚洲欧美日韩精品一区二区| 丰满少妇一区| 欧美黄色一区| 日本欧美久久久久免费播放网| 午夜久久免费观看| 亚洲激情中文在线| 国产在线不卡| 久久久久久美女精品| 视频二区不卡| 成人久久久久| 国产精品av一区二区| 亚洲福利一区| 日本欧美不卡| 亚洲大片在线| av不卡在线看| 丝瓜av网站精品一区二区| 欧美精品自拍| 麻豆91精品| 亚洲精选91| 国产欧美三级| 给我免费播放日韩视频| 久久久久久色| 中文字幕av亚洲精品一部二部| 亚洲黄页一区| 日韩和欧美一区二区三区| 奇米777国产一区国产二区| 国产精品videossex| 日韩高清欧美| 女人av一区| 少妇精品久久久一区二区| 国产精品免费不| 国产成年精品| 久久一区二区中文字幕| 日韩午夜黄色| 国产麻豆一区二区三区精品视频| 国内精品伊人| 欧美日韩国产亚洲一区| 日韩欧美在线精品| 国产精品蜜月aⅴ在线| 亚洲日本网址| 日韩精品乱码av一区二区| 国产一区二区三区日韩精品 | 97精品一区二区| 99在线精品免费视频九九视| 午夜天堂精品久久久久| 精品国产91| 亚洲欧美日韩国产综合精品二区| 国产免费av国片精品草莓男男| 国产一区二区三区探花| 模特精品在线| 国产在线观看91一区二区三区| 伊人久久亚洲热| 久久一区国产| 日韩一区二区三区精品视频第3页| 精品三级av在线导航| 天堂av在线一区| 欧美片第1页| 麻豆一区二区99久久久久| 亚洲人成网站在线在线观看| 久久精品播放| 欧美激情视频一区二区三区免费| 亚洲综合国产| 欧美午夜精品一区二区三区电影| 九九99久久精品在免费线bt| 欧美视频精品全部免费观看| 久色成人在线| 免费黄色成人| 欧美成人日韩| 九色porny丨国产首页在线| 精品99在线| 国产精品一区二区av交换| 一区二区亚洲视频| 黄色欧美日韩| 亚洲激情黄色| 欧美1级日本1级| 99精品视频在线| 欧美中文字幕一区二区| 视频小说一区二区| 久久久一本精品| 91精品国产乱码久久久久久久 | 日韩avvvv在线播放| 日韩在线网址| 欧美啪啪一区| 欧美成人aaa| 精品中文在线| 日韩成人综合| 中文欧美日韩| 天使萌一区二区三区免费观看| 日韩一级不卡| 蜜桃传媒麻豆第一区在线观看| 喷白浆一区二区| 久久精品99国产精品| 麻豆一区在线| 欧美成人高清| 日本特黄久久久高潮| 国产激情久久| 欧美综合另类| 亚洲狼人精品一区二区三区| 国产精品nxnn| 欧美日韩国产传媒| 啪啪亚洲精品| 久久精品主播| 日韩欧美中文在线观看| 欧美日韩网址| 不卡一二三区| 久久国产精品久久久久久电车| 国产日韩欧美一区二区三区 | 99久久99久久精品国产片果冰| 视频一区中文| 国产精品免费99久久久| 欧美一区二区三区高清视频| 日韩毛片一区| 伊人久久大香线蕉av不卡| 蜜桃久久久久久久| 国产精品1区| 美女久久网站| 国产精品精品| 亚洲久久一区| 免费观看久久av| 国产精品**亚洲精品| 免费中文字幕日韩欧美| 欧美好骚综合网| 亚州av一区| 激情综合网址| 国产不卡人人| 国产精品亚洲片在线播放| 亚洲欧洲午夜| 午夜精品久久久久久久久久蜜桃| 亚洲欧美在线专区| 香蕉成人av| 精品国产欧美日韩| 久久不卡国产精品一区二区| 日韩视频一区| 青青草国产精品亚洲专区无| 久久永久免费| 日韩av片子| 99热国内精品| 日韩精品一区二区三区免费视频| 日韩网站在线| 国产精品日韩精品中文字幕| 美女毛片一区二区三区四区最新中文字幕亚洲| 久久精品72免费观看| 性欧美长视频| 日韩高清不卡| 国产欧美69| 亚洲精品乱码久久久久久蜜桃麻豆| 一区免费视频| 蜜臀av亚洲一区中文字幕| 亚洲免费播放|