日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

發(fā)布時間:2025/3/21 javascript 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.1、獲取http請求參數(shù)是一種剛需

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

前置獲取參數(shù),統(tǒng)計請求數(shù)據(jù)

做服務(wù)的接口簽名校驗

敏感接口監(jiān)控日志

敏感接口防重復(fù)提交

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

1.2、定義攔截器獲取請求

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

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

/**

* @author axin

* @summary HTTP請求攔截器

*/

@Slf4j

public class RequestInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//獲取請求參數(shù)

String queryString = request.getQueryString();

log.info("請求參數(shù):{}", queryString);

//獲取請求body

byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());

String body = new String(bodyBytes, request.getCharacterEncoding());

log.info("請求體:{}", body);

return true;

}

}

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

/**

* WebMVC配置,你可以集中在這里配置攔截器、過濾器、靜態(tài)資源緩存等

*/

@Configuration

public class WebMvcConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**");

}

}

定義個接口測試一下

/**

* @author axin

* @summary 提交測試接口

*/

@Slf4j

@RestController

public class MyHTTPController {

@GetMapping("/v1/get")

public void get(@RequestParam("one") String one,

@RequestParam("two") BigDecimal number) {

log.info("參數(shù):{},{}", one, number);

}

@PostMapping("/v1/post")

public void check(@RequestBody User user) {

log.info("{}", JSON.toJSONString(user));

}

}

GET請求獲取請求參數(shù)示例:

POST請求獲取請求Body示例:

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

1.3、為什么攔截器會重復(fù)調(diào)兩遍呢?

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

1.4、ServletInputStream(CoyoteInputStream) 輸入流無法重復(fù)調(diào)用

而之前出現(xiàn)的 Required request body is missing 錯誤 其實(shí)是ServletInputStream被讀取后無法第二次再讀取了,所以我們要把讀取過的內(nèi)容存下來,然后需要的時候?qū)ν馓峁┛杀恢貜?fù)讀取的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的外部組件,可以重點(diǎn)關(guān)注一下。

* @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配置,你可以集中在這里配置攔截器、過濾器、靜態(tài)資源緩存等

*/

@Configuration

public 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();

}

}

再調(diào)用一下 POST請求:

請求成功!

1.5、總結(jié)一下 展望一下

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

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

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

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

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

到此這篇關(guān)于SpringBoot攔截器如何獲取http請求參數(shù)的文章就介紹到這了,更多相關(guān)SpringBoot攔截器獲取http請求參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

總結(jié)

以上是生活随笔為你收集整理的拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人国产一区 | 亚洲国产18| 在线天堂中文字幕 | 99视频在线观看免费 | 日韩在线观看视频网站 | 美国一区二区三区 | 欧美一区二区三区公司 | 久久99日韩 | 成人午夜视频精品一区 | 怡红院毛片 | 女人18片毛片60分钟 | 国产私拍视频 | 欧美日韩18 | 日日干夜夜拍 | 伊人网综合网 | 男人天堂手机在线观看 | 毛片国产精品 | 亚洲无限看| 国产综合内射日韩久 | 亚洲精品视频一二三区 | 国产卡一卡二卡三 | 91精品国产自产精品男人的天堂 | 久久久久久亚洲中文字幕无码 | 日本欧美国产 | 精品少妇一二三区 | 看免费毛片 | 麻豆视频免费版 | 日韩在线毛片 | 国产午夜精品在线观看 | 久久受| 日韩在线观看网址 | 中文字幕电影av | 少妇精品久久久一区二区三区 | 亚洲阿v天堂 | 欧美日韩中文字幕一区二区 | 三级自拍 | 午夜av福利 | 久久婷婷六月 | 久久综合加勒比 | 久久欧| 亚洲热在线观看 | 欧美一区二区三区色 | 国产18在线 | 国产色av| 91免费在线播放 | 亚洲国产aⅴ精品一区二区 日韩黄色在线视频 | 日本不卡网站 | 日韩另类视频 | 北岛玲av在线 | 亚洲性在线 | 人成免费在线视频 | 久久一线 | 日韩精彩视频在线观看 | 日韩中文字幕视频 | 亚洲国产日韩一区无码精品久久久 | 婷婷综合亚洲 | 黄色资源网站 | 亚洲最大的成人网站 | 国产精品污www在线观看 | 国产精品天美传媒 | 北条麻妃一区二区三区 | 久久久久人妻精品色欧美 | 国产成人无码www免费视频播放 | 杨幂毛片 | 亚洲国产日韩在线 | 国产高清自拍一区 | 国产精品久久网 | 熟妇人妻中文字幕 | 日韩欧美在线中文字幕 | 欧美性在线视频 | 亚洲男女在线观看 | 日本精品99 | 亚洲不卡视频在线观看 | 丁香婷婷一区二区三区 | 1000部国产精品成人观看 | 香蕉一区二区 | 久久色网 | 欧美性猛交xxxx乱大交退制版 | 熟女人妻一区二区三区免费看 | 国产精品综合视频 | 蜜臀久久| 怡红院av亚洲一区二区三区h | 国产精品无码一区二区桃花视频 | 久久性生活视频 | 国内精品视频 | 婷婷视频在线观看 | 天天骑夜夜操 | 久久精品久久国产 | 精品人妻一区二区三区蜜桃 | 免费网站看av| 麻豆网址 | 国产欧美一区二区精品性色 | 久久久影视 | 操皮视频 | 亚洲中文字幕无码一区二区三区 | 久久这里有精品视频 | 亚洲精品鲁一鲁一区二区三区 | 色综合区 | 国产成人精品国内自产拍免费看 |