Skip to content

feat(framework): Add request body cache filters and enhance request parameter resolution #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Enumeration;
import java.util.List;
import java.util.*;

/**
* HttpServletRequest 请求参数解析成 PageRequest对象
Expand Down Expand Up @@ -57,7 +58,21 @@ public void removeFilter(String key) {
pageRequest.removeFilter(key);
this.removeKeys.add(key);
}

//get requestBody support post request
public String getBody() {
StringBuilder sb = new StringBuilder();
try {
InputStream inputStream = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return sb.toString();
}
public String getParameter(String key) {
return request.getParameter(key);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.codingapi.springboot.framework.servlet;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.*;

@Configuration
@ConditionalOnClass(name = "jakarta.servlet.Filter")
public class RequestBodyCachingFilterConfiguration {

@Bean
public FilterRegistrationBean<RequestBodyCachingFilter> registration() {
FilterRegistrationBean<RequestBodyCachingFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new RequestBodyCachingFilter());
registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置为最高优先级
return registration;
}

@Slf4j
@WebFilter("/*")
public static class RequestBodyCachingFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(httpServletRequest);
log.info("RequestBodyCachingFilter:{}", cachedBodyHttpServletRequest.getRequestURI());
chain.doFilter(cachedBodyHttpServletRequest, response);
}

@Override
public void destroy() {
// 销毁操作
}
}

public static class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
private final byte[] cachedBody;

public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
InputStream requestInputStream = request.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = requestInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
}
cachedBody = byteArrayOutputStream.toByteArray();
}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cachedBody);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return byteArrayInputStream.available() == 0;
}

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

@Override
public void setReadListener(ReadListener readListener) {
throw new UnsupportedOperationException();
}

@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ com.codingapi.springboot.framework.event.SpringEventConfiguration,\
com.codingapi.springboot.framework.exception.ExceptionConfiguration,\
com.codingapi.springboot.framework.event.HandlerBeanDefinitionRegistrar,\
com.codingapi.springboot.framework.event.SpringHandlerConfiguration,\
com.codingapi.springboot.framework.servlet.BasicHandlerExceptionResolverConfiguration
com.codingapi.springboot.framework.servlet.BasicHandlerExceptionResolverConfiguration,\
com.codingapi.springboot.framework.servlet.RequestBodyCachingFilterConfiguration
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ com.codingapi.springboot.framework.exception.ExceptionConfiguration
com.codingapi.springboot.framework.event.HandlerBeanDefinitionRegistrar
com.codingapi.springboot.framework.event.SpringHandlerConfiguration
com.codingapi.springboot.framework.servlet.BasicHandlerExceptionResolverConfiguration
com.codingapi.springboot.framework.servlet.RequestBodyCachingFilterConfiguration