springboot @RequestBody注解 application/json類型請求參數(shù)復(fù)用

@RequestBody注解參數(shù)的接口以 application/json 作為請求頭Content-Type的類型肛响,以輸入流的方式讀取json類型參數(shù)告喊,因為是輸入流麸拄,所以只能讀取一次,在一些項目中黔姜,我們可能需要在controller之前使用到請求參數(shù)拢切,比如攔截器、過濾器秆吵、Aspect淮椰,為了滿足這些多次獲取輸入流中參數(shù)需求,利用攔截器對request進行改造;

創(chuàng)建一個類ContentCachingRequestWrapper 繼承 HttpServletRequestWrapper
包括一個內(nèi)部類RequestCachingInputStream 繼承 ServletInputStream

構(gòu)造參數(shù)為HttpServletRequest 的構(gòu)造方法
將輸入流中數(shù)據(jù)緩存到ByteArrayInputStream中主穗,可以重復(fù)讀取

import org.apache.commons.io.IOUtils;

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;

public class ContentCachingRequestWrapper extends HttpServletRequestWrapper{

    private byte[] body;

    private BufferedReader reader;

    private ServletInputStream inputStream;

    public ContentCachingRequestWrapper(HttpServletRequest request) throws IOException{
        super(request);
        loadBody(request);
    }

    private void loadBody(HttpServletRequest request) throws IOException{
        body = IOUtils.toByteArray(request.getInputStream());
        inputStream = new RequestCachingInputStream(body);
    }


    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body){
        this.body=body;
        inputStream = new RequestCachingInputStream(body);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        if (inputStream != null) {
ServletInputStream tmp = this.inputStream;
            this.inputStream = new RequestCachingInputStream(body);
            return tmp;
            return inputStream;
        }
        return super.getInputStream();
    }

    @Override
    public BufferedReader getReader() throws IOException {
        if (reader == null) {
            reader = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
        }
        return reader;
    }

    private static class RequestCachingInputStream extends ServletInputStream {

        private final ByteArrayInputStream inputStream;

        public RequestCachingInputStream(byte[] bytes) {
            inputStream = new ByteArrayInputStream(bytes);
        }
        @Override
        public int read() throws IOException {
            return inputStream.read();
        }

        @Override
        public boolean isFinished() {
            return inputStream.available() == 0;
        }

        @Override
        public boolean isReady() {
            return true;
        }

        @Override
        public void setReadListener(ReadListener readlistener) {
        }

    }

}

創(chuàng)建過濾器配置類

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import sjy.notion.notion.app.filter.ValidateFilter;

import javax.servlet.DispatcherType;

/**
 * @author zhang
 * @date 2019/3/29 上午12:01
 */
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean validateFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new ValidateFilter());
        registration.addUrlPatterns("/*");
        registration.setName("validateFilter");
        registration.setOrder(Integer.MAX_VALUE);
        return registration;
    }
}

創(chuàng)建過濾器過濾request

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class ValidateFilter implements Filter {

    private static Logger log = LoggerFactory.getLogger(ValidateFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper((HttpServletRequest) request);
        chain.doFilter(requestWrapper, response);
    }
     
}

request.getInputStream() 就可以重復(fù)獲取數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泻拦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忽媒,更是在濱河造成了極大的恐慌争拐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猾浦,死亡現(xiàn)場離奇詭異陆错,居然都是意外死亡,警方通過查閱死者的電腦和手機金赦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來对嚼,“玉大人夹抗,你說我怎么就攤上這事∽菔” “怎么了漠烧?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長靡砌。 經(jīng)常有香客問我已脓,道長,這世上最難降的妖魔是什么通殃? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任度液,我火速辦了婚禮,結(jié)果婚禮上画舌,老公的妹妹穿的比我還像新娘堕担。我一直安慰自己,他們只是感情好曲聂,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布霹购。 她就那樣靜靜地躺著,像睡著了一般朋腋。 火紅的嫁衣襯著肌膚如雪齐疙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天旭咽,我揣著相機與錄音贞奋,去河邊找鬼。 笑死轻专,一個胖子當著我的面吹牛忆矛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼催训,長吁一口氣:“原來是場噩夢啊……” “哼洽议!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漫拭,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亚兄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后采驻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體审胚,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年礼旅,在試婚紗的時候發(fā)現(xiàn)自己被綠了膳叨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡痘系,死狀恐怖菲嘴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汰翠,我是刑警寧澤龄坪,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站复唤,受9級特大地震影響健田,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佛纫,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一妓局、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雳旅,春花似錦跟磨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至型豁,卻和暖如春僵蛛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迎变。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工充尉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衣形。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓驼侠,卻偏偏與公主長得像姿鸿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子倒源,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容