0
点赞
收藏
分享

微信扫一扫

uniapp插件uViewplus的使用(涉及TS下的问题)

荷一居茶生活 2024-02-24 阅读 7

目录

1、背景

2、解决方案

2.1、自定义HttpServletRequestWrapper

2.2、JsonRequestHeaderParamsHelper

2.3、HttpServletRequestReplacedFilter

2.4、使用


1、背景

2、解决方案

2.1、自定义HttpServletRequestWrapper

由于请求信息存储在流中,只能调用一次,因此将其存储到字节数组中,保证之后调用getReader()和getInputStream()均通过body数组来获取数据。

public class BodyReaderHttpServletRequestWrapper extends
HttpServletRequestWrapper {

    private final byte[] body;

    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request)
            throws IOException {
        super(request);
        body = JsonRequestHeaderParamsHelper.bufferReaderToString(request.getReader()).getBytes();
    }

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

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = 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() {
                return byteArrayInputStream.read();
            }
        };
    }
}

2.2、JsonRequestHeaderParamsHelper

@Slf4j
public class JsonRequestHeaderParamsHelper {
    public static JSONObject parseHeader(ServletRequest request) throws IOException {
        return JSON.parseObject(bufferReaderToString(request.getReader()));
    }

    public static String bufferReaderToString(BufferedReader reader) throws IOException {
        StringBuilder sb = new StringBuilder();
        try  {
            char[] buff = new char[1024];
            int len;
            while ((len = reader.read(buff)) != -1) {
                sb.append(buff, 0, len);
            }
        } catch (IOException e) {
            log.error("bufferReaderToString error", e);
        }
        return sb.toString();
    }
}

2.3、HttpServletRequestReplacedFilter

@Slf4j
@Order(value = 0)
@WebFilter(filterName = "httpServletRequestReplacedFilter", urlPatterns = "/*")
public class HttpServletRequestReplacedFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("进入HttpServletRequestReplacedFilter");
        ServletRequest requestWrapper = null;
        if(request instanceof HttpServletRequest) {
            requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
        }
        if(null == requestWrapper) {
            chain.doFilter(request, response);
        } else {
            chain.doFilter(requestWrapper, response);
        }

    }

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

    }

    @Override
    public void destroy() {

    }
}

2.4、使用

之后就可以愉快地使用request.getParameter,@RequestBody等等了。

附上get和post手动获取请求参数的方法:

        if("GET".equals(request.getMethod())|| "DELETE".equals(request.getMethod())) {
            JSONObject jsonObject = JSONObject.fromObject(request.getParameterMap());
            params=jsonObject.toString();
            log.info("get请求参数为:{}", params);
        }else {
            com.alibaba.fastjson.JSONObject jsonObject =JsonRequestHeaderParamsHelper.parseHeader(request);
            params=jsonObject.toJSONString();
            log.info("post请求参数为:{}",params);
        }

如果对你有帮助,点赞、收藏、关注是我更新的动力!

举报

相关推荐

0 条评论