HttpServletRequest读取流的时候,出现如标题所示无法再读或者读出来表现为空的情况,是由于在框架或者其他地方已经读了一次。

在上一篇中用了一种方式处理;在上一种方式中,把HttpServletRequest全部实例化为MyRequestWrapper,用来保存副本;个人始终觉得不是很好。

今晚回家,思考了一下,用另外一种方式进行了处理,最终效果一致;记录如下:

package net.dlet.dhdemo.configure;import net.dlet.dhdemo.utils.dhutils.CarHttpServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Description: 自定义servlet配置类* @PackageName: net.dlet.dhdemo.configure* @Name: CarServletConfig* @Author: crue* @CreateDate: 2020/09/07 21:24* @DayNameFull: 星期一* @ProjectName: dhdemo* @Version: 1.0**/
@Configuration
public class CarServletConfig {@Beanpublic ServletRegistrationBean servletRegistrationBean() {//注册自定义servletServletRegistrationBean registrationBean = new ServletRegistrationBean(new CarHttpServlet());registrationBean.addUrlMappings("/ipms/DH/Devices/1000019$0/Events", "/DH/Devices/1000019$0/Events");return registrationBean;}
}
package net.dlet.dhdemo.utils.dhutils;import net.dlet.dhdemo.service.TestService;
import net.dlet.dhdemo.utils.SpringUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description: 自定义servlet* 注意: urlPatterns 这里必须排列在一行,不能主动换行* @PackageName: net.dlet.dhdemo.utils.dhutils* @Name: HttpServletRequest* @Author: crue* @CreateDate: 2020/09/07 21:33* @DayNameFull: 星期一* @ProjectName: dhdemo* @Version: 1.0**/
//@WebServlet(name = "CarHttpServlet", urlPatterns = {"/ipms/DH/Devices/**","/DH/Devices/**"})
public class CarHttpServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {TestService testService = SpringUtil.getBean(TestService.class);testService.dealDhDataCustom(req, resp);}}

1、TestService中dealDhDataCustom函数实现如下:

 public String dealDhDataCustom(HttpServletRequest servletRequest, HttpServletResponse response) throws IOException {String encoding = "ISO-8859-1";//取Body数据 读出数据流
//        String[] inputStream = IOUtils.readLines(servletRequest.getInputStream());byte[] buffer = StreamUtils.getByteByStream(servletRequest.getInputStream(), servletRequest.getContentLength(), encoding);return dealBuffer(servletRequest, buffer, encoding);
}

2、StreamUtils类如下:

package net.dlet.dhdemo.utils.dhutils;import java.io.*;/*** @Description: 处理InputStream流的工具类* @PackageName: net.dlet.dhdemo.utils.dhutils* @Name: StreamUtils* @Author: crue* @CreateDate: 2020/09/06 14:43* @DayNameFull: 星期日* @ProjectName: dhdemo* @Version: 1.0**/
public class StreamUtils {/*** 读取流中的数据将其转换为byte数组* @param is 输入流* @param contentLength 内容的长度* @param encodeing 编码方式* @return byte数组* @throws IOException 读或者写可能出现io异常*/public static byte[] getByteByStream(InputStream is, int contentLength, String encodeing) throws IOException {ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = is.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}outSteam.close();is.close();return outSteam.toByteArray();}
}

值得注意的是,在用@WebServlet注解的时候,开始的时候为了美观,把urlPatterns后面的参数换行格式化了一下。然而模拟发送数据,死活无法进去,后面只好排成一排。

 

getInputStream() has already been called for this request解决方法二相关推荐

  1. SpringMvc 400 Bad Request解决方法

    SpringMvc 400 Bad Request解决方法 参考文章: (1)SpringMvc 400 Bad Request解决方法 (2)https://www.cnblogs.com/shiz ...

  2. jenkins-RestAPI调用出现Error 403 No valid crumb was included in the request解决方法

    方法一: 在jenkins 的Configure Global Security下 , 取消"防止跨站点请求伪造(Prevent Cross Site Request Forgery exp ...

  3. oracle connect权限6,Oracle 19c 升级19.6 RU 导致权限异常 gipcInternalConnectSync: failed sync request 解决方法...

    这2天一直在测试RAC 环境的19.6 的RU升级问题.因为opatchauto 一起升级GI 和DB 操作导致CRS 权限异常, CRS 无法启动. 根据提示,之前已经处理过一批错误,如下: htt ...

  4. curl调用新版jenkins crumb报错 No valid crumb was included in the request 解决方法

    说明:新版本的jenkins不能关闭csrf检校.也不建议关闭. jenkis版本:2.319.1 linux操作系统下 操作: 参数设置: jenkins_user=root jenkins_pas ...

  5. HTTP请求报错:400 Bad Request解决方法!!(终极整理)

    问题场景:当项目的前端页面使用ajax请求访问后端时,出现该错误. 我这里是测试接口时,发生了错误. 原因一:请求参数个数不对. 后端接口上明确规定了请求参数的个数.比如:接口(方法)中的值中使用了r ...

  6. getReader()/getInputStream() has already been called for this request

    项目中需要在filter对request中body中的数据进行处理,发现了这个问题 getRead() has already been called for this request/getInpu ...

  7. 异常:getInputStream() has already been called for this request

    异常:getInputStream() has already been called for this request... 造成异常的代码: 从请求中获取body参数 BufferedReader ...

  8. getInputStream() has already been called for this request

    getInputStream() has already been called for this request 使用场景:通过request能获取到一次body中的值,有时候我们需要多次获取bod ...

  9. Nginx出现“413 Request Entity Too Large”错误解决方法

    今天使用phpmyadmin的导入功能的时候,由于sql文件过大,服务器出现错误提示了,413 Request Entity Too Large,google了一下,发现是Nginx的错误提示.  解 ...

最新文章

  1. altium designer 不自动清除回路 清除功能打开失效
  2. Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0
  3. Kotlin中?和!!的区别
  4. (大纲)三小时学会openCV
  5. 如何用ThreadLocals射击自己
  6. JS写纸牌发牌和动画(详细解剖)
  7. C#设计模式之3-建造者模式
  8. 使用负载均衡SLB时为何出现请求分布不均衡的现象
  9. SqlZoo.net习题答案:Using the SELECT statement.【nobel】
  10. springcloud-gateway路由配置和跨域配置
  11. 演示:扩展ACL的配置与应用技巧
  12. 基于IDEA的Spring源码调试
  13. matlab最小二乘法拟合直线
  14. Dr_can模型预测控制笔记与代码实现
  15. url 转码 java_java中URL转码
  16. 关于Echarts官网httpsecharts.apache.org打不开的解决方案
  17. Python代码画喜羊羊怎么画_卧槽!没想到,用Python竟能做五仁月饼
  18. 没学后端也能开发小程序——微信小程序云开发的介绍知识
  19. 九度oj-1158-买房子
  20. 公众号网课搜题接口系统调用搭建

热门文章

  1. 教你如何寻找更多的外链
  2. 构件组装-总结与展望
  3. CHIL-SQL-CREATE TABLE 语句
  4. 从搜索引擎打击论坛外链看se规范行业
  5. MySQL HeatWave Quickstart AutoPilot简介
  6. Python函数进阶(11)
  7. win7 修改服务器属性,win7打印机服务器属性设置
  8. 用U盘安装系统完全教程
  9. 如果你已经掌握了 Python 101,那么你可能比 OpenAI 的原型 Codex 更擅长编程
  10. ROS2_foxy教程总结(自用)