栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot解决拦截器InputStream只能获取一次问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot解决拦截器InputStream只能获取一次问题

在代码编写过程中,我们使用拦截器做通用的业务拦截处理。但通过request.getInputStream()获取了后,再到Controller层就获取不到流了。本文对此问题处理过程如下。

第一步:先创建自定义CustomRequestWrapper

import jodd.io.StreamUtil;

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;


public class CustomRequestWrapper extends HttpServletRequestWrapper {
    
    private  byte[] body;

    public CustomRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        
        body = StreamUtil.readBytes(request.getReader(), "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 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();
            }
        };
    }

    
    public byte[] getBody() {
        return body;
    }
    
    public void setBody(byte[] body) {
        this.body = body;
    }
}

 第二步:创建过滤器ChannelFilter,目的是将流再传递

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(urlPatterns = "
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest requestWrapper = null;
        if(servletRequest instanceof HttpServletRequest) {
            requestWrapper = new CustomRequestWrapper((HttpServletRequest) servletRequest);
        }
        if(requestWrapper == null) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            filterChain.doFilter(requestWrapper, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

注意,这里springboot要启动拦截器功能

@Configuration
@EnableScheduling
@ServletComponentScan
@ComponentScan
public class ApplicationConfig {
}

第三步:使用自定义CustomRequestWrapper

// POST请求通过流获取参数
CustomRequestWrapper requestWrapper = new CustomRequestWrapper(request);
String body = new String(requestWrapper.getBody(), StandardCharsets.UTF_8);

小细节:这里的请求方式一定是POST,小坑勿踩

补充一下,通过request获取参数时,根据GET和POST请求的方式不一样

        Map paramMap = Maps.newTreeMap();
        if(Constants.GET.equals(request.getMethod())){
            // GET请求直接获取
            Enumeration parameterNames = request.getParameterNames();
            if(parameterNames.hasMoreElements()){
                String key = parameterNames.nextElement();
                String value = request.getParameter(key);
                paramMap.put(key, value);
            }
        }
        if(Constants.POST.equals(request.getMethod())){
            // POST请求通过流获取参数
            CustomRequestWrapper requestWrapper = new CustomRequestWrapper(request);
            String body = new String(requestWrapper.getBody(), StandardCharsets.UTF_8);
            if(StringUtils.isNotBlank(body)){
                paramMap = JsonUtils.jsonToPojo(body, Map.class);
            }
        }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/332017.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号