springboot 获取body内数据并赋值给servlet, 同时保留body数据

本文介绍如何在SpringBoot应用中使用过滤器(Filter)捕获HTTP请求体的数据,并通过自定义的`ParameterRequestWrapper`类重新封装请求,以确保请求体在后续处理中仍可读。配置过滤器的方法包括直接在启动类或@Configuration注解的类中添加代码。
摘要由CSDN通过智能技术生成

在此我们通过过滤器来完成本功能

@WebFilter(filterName = "RequestBodyFilter", urlPatterns = "/**")
public class RequestBodyFilter implements Filter {
    public static final String LOGTHREAD_ID="logthreadId";
    private static final Logger LOGGER = LoggerFactory.getLogger(RequestBodyFilter.class);

    public static final String URI_ENCODING = NsConfiguration.getInstance()
            .getConf(NsConfiguration.KEY_URI_ENCODING);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //日志打印唯一标识
        MDC.put(LOGTHREAD_ID,java.util.UUID.randomUUID().toString().replace("-",""));

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("UTF-8");
        //获取body数据
        BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while((line = reader.readLine())!=null){
            sb.append(line);
        }
        String postContent = sb.toString();

        //如果body中存在数据放入HttpServletRequest
        if (!RequestBodyFilter.isEmpty(postContent) ){
            request = new ParameterRequestWrapper(request);
            LOGGER.debug(postContent);
            String[] params = postContent.split("&");
            for (String param : params) {
                String[] pkv = param.split("=");
                String data = URLDecoder.decode(pkv[1], URI_ENCODING);
                ((ParameterRequestWrapper)request).addParameter(pkv[0],data);
            }
        }
        filterChain.doFilter(request,response);

    }

    @Override
    public void destroy() {

    }

    public static boolean isEmpty(Object str) {
        return str == null || "".equals(str) || "{}".equals(str);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值