作者:gloriamm_520 | 来源:互联网 | 2023-06-04 08:47
解决springboot只能获取一次post请求的body数据自定义一个类继承HttpServletRequestWrapper创建一个拦截器自定义一个类继承HttpServle
解决springboot只能获取一次post请求的body数据
- 自定义一个类继承 HttpServletRequestWrapper
- 创建一个拦截器
自定义一个类继承 HttpServletRequestWrapper
HttpServletRequestWrapper 类可以用来做关键字过滤器,因为post提交的请求是以流的形式存放,所以获取也需要以流方式获取,但是如果在拦截器中直接获取,那么在controller中将无法在获取第二次,因为流的指针无法回到最初的位置。所以使用此类就可以解决此类问题。原理是将内容以流的形式获取后,在将内容以流的形式存放进request请求中。
import com.jgmes.base.utils.JgmesFilterSpecialCharUtil;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
import java.util.List;
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {private final byte[] body;public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);String sessStr = getBody(request);this.body = sessStr.getBytes(Charset.forName("UTF-8"));}public String getBody(HttpServletRequest request) throws IOException {StringBuffer stringBuffer = new StringBuffer();InputStream inputStream = request.getInputStream();BufferedReader reader = null;String line = "";while ((line = reader.readLine()) != null){stringBuffer.append(line);}try{reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));}catch (Exception e){throw e;}finally {reader.close();}String param = stringBuffer.toString();filterIllegal(param);return param;}public void filterIllegal(String param){List<String> illegalStrings = JgmesFilterSpecialCharUtil.existsSpecialChar(param);if(illegalStrings != null && illegalStrings.size() > 0){String illegalString = StringUtils.join(illegalStrings.toArray(), ",");throw new RuntimeException("非法字符被拦截:"+ illegalString);}}
}
创建一个拦截器
import com.alibaba.fastjson.JSONObject;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;
@WebFilter(filterName = "specialCharFilter", urlPatterns = {"/base-form-template-data/*", "/base-form-template/*", "/base-table/*"})
public class specialCharFilter implements Filter {private BodyReaderHttpServletRequestWrapper wrapper;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;wrapper = new BodyReaderHttpServletRequestWrapper(request);filterGetSpace(request);filterChain.doFilter(wrapper, servletResponse);}public void filterGetSpace(HttpServletRequest request){Map param = request.getParameterMap();String paramStr = JSONObject.toJSONString(param);wrapper.filterIllegal(paramStr);}@Overridepublic void destroy() {}
}