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

springboot 扩展HttpServletRequestWrapper拦截请求修改参数

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

springboot 扩展HttpServletRequestWrapper拦截请求修改参数

  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);
    }

    
    private void cleanupSystemParams() {
        ThreadLocalContext.systemParamsThreadLocal.remove();
    }

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

    @Override
    public void destroy() {

    }

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

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

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