Java多次获取Request Body的实现

it2024-08-04  36

HttpHelper 获取 request body

public class HttpHelper { private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); /** * get request Body * */ public static String getBodyString(ServletRequest request) { StringBuilder sb = new StringBuilder(); try (InputStream inputStream = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { String line = ""; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { LOGGER.error(e.getMessage(), e); } return sb.toString(); } }

BodyReaderHttpServletRequestWrapper 缓存 request body

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); body = HttpHelper.getBodyString(request).getBytes("UTF-8"); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } }; } }

Filter 中替换后续的 Request 实例

@Order(1) @WebFilter(filterName = "paramFilter", urlPatterns = "/*") public class RequestWrapperFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @SuppressWarnings("unchecked") @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; ServletRequest servletRequest = new BodyReaderHttpServletRequestWrapper(httpServletRequest); chain.doFilter(servletRequest, response); } @Override public void destroy() { } }
最新回复(0)