1. 继承HttpServletRequestWrapper,获取请求参数
public class RequestWrapper extends HttpServletRequestWrapper {
    private String body;
    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }
        body = stringBuilder.toString();
    }
 
    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = 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 byteArrayInputStream.read();
            }
        };
        return servletInputStream;
 
    }
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    public String getBody() {
        return this.body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}

  1. 使用filter 配合RequestWrapper ,实现参数变形
@Slf4j
@Component
public class ParameterFilter extends OncePerRequestFilter {

    @Autowired
    private MultipartResolver multipartResolver;
    @Autowired
    private JsonUtil jsonUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        boolean multipartParsed = false;
        HttpServletRequest req = request;
        if (multipartResolver.isMultipart(req)) {
            req = multipartResolver.resolveMultipart(req);
            multipartParsed = true;
        }
        ServletRequest requestWrapper = null;
        if(req instanceof HttpServletRequest) {
            requestWrapper = new RequestWrapper(req);
        }
        try {
            if(requestWrapper == null) {
                chain.doFilter(req, response);
            } else {
                handleSystemParams((RequestWrapper) requestWrapper);
                handleBizParams((RequestWrapper) requestWrapper);
                chain.doFilter(requestWrapper, response);
            }
        } catch (Throwable e) {
            log.error("parameter Filter exception:{}",e);
        } finally {
            if (multipartParsed) {
                cleanupMultipart(req);
            }else {
                cleanupSystemParams();
            }
        }
    }

    /**
     * 处理业务参数
     */
    private void handleBizParams(RequestWrapper wrapper) {
        String bodyStr = wrapper.getBody();
        log.info("url:{},body:{}", wrapper.getRequestURI(), bodyStr);
        if (StringUtils.isBlank(bodyStr)){
            return;
        }
        JSONObject bodyJsonObject = new JSONObject(bodyStr);
        String dataStr = bodyJsonObject.getStr("data");
        JSONObject dataJsonObject = new JSONObject(dataStr);
        bodyJsonObject.putAll(dataJsonObject);
        wrapper.setBody(bodyJsonObject.toString());
    }

    /**
     * 处理系统参数
     */
    private void handleSystemParams(RequestWrapper wrapper) {
        String bodyStr = wrapper.getBody();
        if (StringUtils.isBlank(bodyStr)){
            return;
        }
        SystemParams systemParams = jsonUtil.toObj(bodyStr,SystemParams.class);
        ThreadLocalContext.systemParamsThreadLocal.set(systemParams);
    }

    /**
     * 清除systemParamsThreadLocal
     */
    private void cleanupSystemParams() {
        ThreadLocalContext.systemParamsThreadLocal.remove();
    }

    /**
     * 清除cleanupMultipart
     */
    protected void cleanupMultipart(HttpServletRequest request) {
        MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
        if (multipartRequest != null) {
            this.multipartResolver.cleanupMultipart(multipartRequest);
        }
    }

    @Override
    public void destroy() {

    }

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐