SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)
1). 存在問題
流只能讀取一次
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()只能讀取一次的問題 ?* 目標(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ǔ)起來 ? ? ? ? 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è)置過濾器(必須)
@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)求中的流如何,將取出來的字符串,再次轉(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)文章
IDEA導(dǎo)出jar打包成exe應(yīng)用程序的小結(jié)
這篇文章主要介紹了IDEA導(dǎo)出jar打包成exe應(yīng)用程序,需要的朋友可以參考下2020-08-08MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹
MyBatis緩存分為一級(jí)緩存和二級(jí)緩存一級(jí)緩存,本文給大家介紹mybatis緩存知識(shí),非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實(shí)例代碼
這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題
這篇文章主要介紹了解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問
這篇文章主要介紹了通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat)
這篇文章主要介紹了SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10java中的日期時(shí)間類Date和SimpleDateFormat
這篇文章主要介紹了java中的日期時(shí)間類Date和SimpleDateFormat,Date類的對(duì)象在Java中代表的是當(dāng)前所在系統(tǒng)的此刻日期時(shí)間,說白了就是你計(jì)算機(jī)上現(xiàn)實(shí)的時(shí)間,需要的朋友可以參考下2023-09-09