分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

解决HttpServletRequest InputStream只能读取一次问题

发布时间:2023-09-06 02:00责任编辑:彭小芳关键词:暂无标签

在Filter中读取inputSeream读取一次之后就无法再次读取,解决办法如下:

public class LoggerHttpServletRequestWrapper extends HttpServletRequestWrapper { ?????private final byte[] body; ??public LoggerHttpServletRequestWrapper(HttpServletRequest request) throws IOException { ?????super(request); ?????body = StreamUtils.readBytes(request.getInputStream()); ??} ?????@Override ??public BufferedReader getReader() { ?????return new BufferedReader(new InputStreamReader(getInputStream())); ??} ?????@Override ??public ServletInputStream getInputStream() { ?????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() { ???????????return bais.read(); ????????} ?????}; ??}}

  

调用如下

@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ???ServletRequest requestWrapper = null; ???if(request instanceof HttpServletRequest) { ???????requestWrapper = new LoggerHttpServletRequestWrapper((HttpServletRequest) request); ???????if (((HttpServletRequest) request).getMethod().equals("POST")){ ???????????String path = ((HttpServletRequest) request).getServletPath(); ???????????String param = StreamUtils.streamToString(requestWrapper.getInputStream()); ???????????LoggerFactory.getLogger("filter."+path).info(param); ???????}else if (((HttpServletRequest) request).getMethod().equals("GET")){ ???????????String path = ((HttpServletRequest) request).getServletPath(); ???????????String queryString = ((HttpServletRequest) request).getQueryString(); ???????????LoggerFactory.getLogger("filter."+path).info(queryString); ???????} ???} ???if(requestWrapper == null) { ???????chain.doFilter(request, response); ???} else { ???????chain.doFilter(requestWrapper, response); ???}}

工具类如下

public class StreamUtils { ???/** ????* @param inputStream inputStream ????* @return 字符串转换之后的 ????*/ ???public static String streamToString(InputStream inputStream) { ???????try(BufferedReader br =new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { ???????????StringBuilder builder = new StringBuilder(); ???????????String output; ???????????while((output = br.readLine())!=null){ ???????????????builder.append(output); ???????????} ???????????return builder.toString(); ???????} ?catch (IOException e) { ??????????throw new RuntimeException("Http 服务调用失败",e); ???????} ???} ???????public static byte[] readBytes(ServletInputStream inputStream) { ???????return streamToString(inputStream).getBytes(Charset.forName("UTF-8")); ???}}

解决HttpServletRequest InputStream只能读取一次问题

原文地址:https://www.cnblogs.com/eviltuzki/p/9186165.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved