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)文章
Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼
這篇文章主要介紹了Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
深入學(xué)習(xí)spring cloud gateway 限流熔斷
這篇文章主要介紹了深入學(xué)習(xí)spring cloud gateway 限流熔斷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

