最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)

 更新時(shí)間:2022年01月27日 15:06:05   作者:mazaiting  
本文主要介紹了SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1). 存在問(wèn)題
流只能讀取一次

2). 目標(biāo)
多次讀取流

3). 解決方法
創(chuàng)建包裝類

4). RequestWrapper

package com.mazaiting.redeye.wrapper;
?
import com.mazaiting.redeye.utils.StreamUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
?
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
?
/***
?* @author mazaiting
?* @date 2019-06-27
?* @decription HttpServletRequest 包裝器
?* 解決: request.getInputStream()只能讀取一次的問(wèn)題
?* 目標(biāo): 流可重復(fù)讀
?*/
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
? ? /**
? ? ?* 日志
? ? ?*/
? ? private static final Logger mLogger = LoggerFactory.getLogger(RequestWrapper.class);
?
? ? /**
? ? ?* 請(qǐng)求體
? ? ?*/
? ? private String mBody;
?
? ? public RequestWrapper(HttpServletRequest request) {
? ? ? ? super(request);
? ? ? ? // 將body數(shù)據(jù)存儲(chǔ)起來(lái)
? ? ? ? mBody = getBody(request);
? ? }
?
? ? /**
? ? ?* 獲取請(qǐng)求體
? ? ?* @param request 請(qǐng)求
? ? ?* @return 請(qǐng)求體
? ? ?*/
? ? private String getBody(HttpServletRequest request) {
? ? ? ? try {
? ? ? ? ? ? return StreamUtil.getString(request.getInputStream());
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? mLogger.debug(e.getMessage());
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 獲取請(qǐng)求體
? ? ?* @return 請(qǐng)求體
? ? ?*/
? ? public String getBody() {
? ? ? ? return mBody;
? ? }
?
? ? @Override
? ? public BufferedReader getReader() throws IOException {
? ? ? ? return new BufferedReader(new InputStreamReader(getInputStream()));
? ? }
?
? ? @Override
? ? public ServletInputStream getInputStream() throws IOException {
? ? ? ? // 創(chuàng)建字節(jié)數(shù)組輸入流
? ? ? ? final ByteArrayInputStream bais = new ByteArrayInputStream(mBody.getBytes(Charset.defaultCharset()));
?
? ? ? ? return new ServletInputStream() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean isFinished() {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
?
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean isReady() {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
?
? ? ? ? ? ? @Override
? ? ? ? ? ? public void setReadListener(ReadListener readListener) {
?
? ? ? ? ? ? }
?
? ? ? ? ? ? @Override
? ? ? ? ? ? public int read() throws IOException {
? ? ? ? ? ? ? ? return bais.read();
? ? ? ? ? ? }
? ? ? ? };
? ? }
}

5).設(shè)置過(guò)濾器(必須)

@Component
@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")
@Order(10000)
public class HttpServletRequestFilter implements Filter {
? ? @Override
? ? public void init(FilterConfig filterConfig) throws ServletException {
?
? ? }
?
? ? @Override
? ? public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
? ? ? ? ServletRequest requestWrapper = null;
? ? ? ? if(servletRequest instanceof HttpServletRequest) {
? ? ? ? ? ? requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
? ? ? ? }
? ? ? ? //獲取請(qǐng)求中的流如何,將取出來(lái)的字符串,再次轉(zhuǎn)換成流,然后把它放入到新request對(duì)象中
? ? ? ? // 在chain.doFiler方法中傳遞新的request對(duì)象
? ? ? ? if(null == requestWrapper) {
? ? ? ? ? ? filterChain.doFilter(servletRequest, servletResponse);
? ? ? ? } else {
? ? ? ? ? ? filterChain.doFilter(requestWrapper, servletResponse);
? ? ? ? }
? ? }
?
? ? @Override
? ? public void destroy() {
?
? ? }
}

6). 使用

/***
?*
?* @author mazaiting
?* @date 2019-06-26
?* @decription Session 攔截器
?*/
public class SessionInterceptor implements HandlerInterceptor {
?
? ? /**
? ? ?* 日志
? ? ?*/
? ? private static final Logger mLogger = LoggerFactory.getLogger(SessionInterceptor.class);
?
? ? @Override
? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
? ? ? ? mLogger.debug("SessionInterceptor");
? ? ? ? // 獲取地址
? ? ? ? String url = request.getRequestURL().toString();
? ? ? ? mLogger.debug("url: " + url);
? ? ? ? // 獲取 session
? ? ? ? HttpSession session = request.getSession();
? ? ? ? String id = session.getId();
? ? ? ? mLogger.debug("sessionId: " + id);
? ? ? ? String requestMethod = request.getMethod();
? ? ? ? mLogger.debug("requestMethod: " + requestMethod);
? ? ? ? String servletPath = request.getServletPath();
? ? ? ? mLogger.debug("servletPath: " + servletPath);
?
? ? ? ? if (isJson(request)) {
? ? ? ? ? ? String body = new RequestWrapper(request).getBody();
? ? ? ? ? ? mLogger.debug("body: " + body);
? ? ? ? }
?
? ? ? ? return true;
? ? }
?
? ? /**
? ? ?* 判斷本次請(qǐng)求的數(shù)據(jù)類型是否為json
? ? ?*
? ? ?* @param request request
? ? ?* @return true: 是 JSON 數(shù)據(jù); false: 非 json 數(shù)據(jù)
? ? ?*/
? ? private boolean isJson(HttpServletRequest request) {
? ? ? ? if (request.getContentType() != null) {
? ? ? ? ? ? return request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE) ||
? ? ? ? ? ? ? ? ? ? request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE);
? ? ? ? }
?
? ? ? ? return false;
? ? }
}

到此這篇關(guān)于SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot獲取Post方法的請(qǐng)求body內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之Spring注解開(kāi)發(fā)案例詳解

    Java之Spring注解開(kāi)發(fā)案例詳解

    這篇文章主要介紹了Java之Spring注解開(kāi)發(fā)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • java如何通過(guò)流讀取圖片做base64編碼

    java如何通過(guò)流讀取圖片做base64編碼

    這篇文章主要介紹了java如何通過(guò)流讀取圖片做base64編碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 淺析Java 并發(fā)編程中的synchronized

    淺析Java 并發(fā)編程中的synchronized

    這篇文章主要介紹了Java 并發(fā)編程中的synchronized的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā)編程,感興趣的朋友可以了解下
    2020-12-12
  • 基于Java8 函數(shù)式接口理解及測(cè)試

    基于Java8 函數(shù)式接口理解及測(cè)試

    下面小編就為大家?guī)?lái)一篇基于Java8 函數(shù)式接口理解及測(cè)試。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼

    Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼

    這篇文章主要介紹了Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 深入學(xué)習(xí)spring cloud gateway 限流熔斷

    深入學(xué)習(xí)spring cloud gateway 限流熔斷

    這篇文章主要介紹了深入學(xué)習(xí)spring cloud gateway 限流熔斷,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中的異步非阻塞AIO模型詳解

    Java中的異步非阻塞AIO模型詳解

    這篇文章主要介紹了Java中的異步非阻塞AIO模型詳解,AIO需要操作系統(tǒng)的支持,在linux內(nèi)核2.6版本中加入了對(duì)真正異步IO的支持,java從jdk1.7開(kāi)始支持AIO,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • spring boot jar的啟動(dòng)原理解析

    spring boot jar的啟動(dòng)原理解析

    這篇文章主要介紹了 spring boot jar的啟動(dòng)原理分析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java中抽象類的作用及說(shuō)明

    Java中抽象類的作用及說(shuō)明

    這篇文章主要介紹了Java中抽象類的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java使用GUI實(shí)現(xiàn)貪吃蛇游戲詳解

    Java使用GUI實(shí)現(xiàn)貪吃蛇游戲詳解

    小時(shí)候經(jīng)常在諾基亞上玩的一個(gè)小游戲-貪吃蛇,你還記得嗎?本篇帶你重溫一下把它實(shí)現(xiàn),做的比較簡(jiǎn)單,但還是可以玩的.感興趣的朋友快來(lái)看看吧
    2022-05-05

最新評(píng)論

兴安县| 游戏| 澄江县| 曲阜市| 安达市| 嵊泗县| 香河县| 兴和县| 潼南县| 华坪县| 包头市| 昂仁县| 镶黄旗| 鄂尔多斯市| 北碚区| 凌海市| 乌兰县| 平湖市| 台湾省| 攀枝花市| 綦江县| 上饶县| 泸定县| 灵山县| 略阳县| 定兴县| 湛江市| 印江| 神木县| 东阳市| 正定县| 斗六市| 交城县| 和静县| 晋中市| 闵行区| 镇平县| 浦县| 乐昌市| 沈丘县| 全南县|