SpringBoot項目攔截器獲取Post方法的請求body實現(xiàn)
1). 存在問題
流只能讀取一次
2). 目標
多次讀取流
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()只能讀取一次的問題
?* 目標: 流可重復讀
?*/
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
? ? /**
? ? ?* 日志
? ? ?*/
? ? private static final Logger mLogger = LoggerFactory.getLogger(RequestWrapper.class);
?
? ? /**
? ? ?* 請求體
? ? ?*/
? ? private String mBody;
?
? ? public RequestWrapper(HttpServletRequest request) {
? ? ? ? super(request);
? ? ? ? // 將body數(shù)據(jù)存儲起來
? ? ? ? mBody = getBody(request);
? ? }
?
? ? /**
? ? ?* 獲取請求體
? ? ?* @param request 請求
? ? ?* @return 請求體
? ? ?*/
? ? private String getBody(HttpServletRequest request) {
? ? ? ? try {
? ? ? ? ? ? return StreamUtil.getString(request.getInputStream());
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? mLogger.debug(e.getMessage());
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 獲取請求體
? ? ?* @return 請求體
? ? ?*/
? ? 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).設置過濾器(必須)
@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);
? ? ? ? }
? ? ? ? //獲取請求中的流如何,將取出來的字符串,再次轉換成流,然后把它放入到新request對象中
? ? ? ? // 在chain.doFiler方法中傳遞新的request對象
? ? ? ? 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;
? ? }
?
? ? /**
? ? ?* 判斷本次請求的數(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;
? ? }
}到此這篇關于SpringBoot項目攔截器獲取Post方法的請求body實現(xiàn)的文章就介紹到這了,更多相關SpringBoot獲取Post方法的請求body內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java編程一維數(shù)組轉換成二維數(shù)組實例代碼
這篇文章主要介紹了Java編程一維數(shù)組轉換成二維數(shù)組,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
解決Java 部署Tomcat時使用jni和jna調(diào)用DLL文件的問題
這篇文章主要介紹了解決Java 部署Tomcat時使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問
這篇文章主要介紹了通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08
SpringBoot2使用Jetty容器操作(替換默認Tomcat)
這篇文章主要介紹了SpringBoot2使用Jetty容器操作(替換默認Tomcat),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
java中的日期時間類Date和SimpleDateFormat
這篇文章主要介紹了java中的日期時間類Date和SimpleDateFormat,Date類的對象在Java中代表的是當前所在系統(tǒng)的此刻日期時間,說白了就是你計算機上現(xiàn)實的時間,需要的朋友可以參考下2023-09-09

