Springboot读取Request参数的坑

【后端拿参数相关】

默认配置时,

getInputStream()和getReader()一起使用会报错

使用两遍getInputStream(),第二遍会为空

当存在@RequestBody等注解时,springMVC已读取过一遍流,默认单独使用getInputStream()或getReader()都为空。

解决:写filter继承HttpServletRequestWrapper,缓存InputStream,覆盖getInputStream()和getReader()方法,使用ByteArrayInputStream is = new ByteArrayInputStream(body.getBytes());读取InputStream。

注意:springboot中,过滤器只需@Component即可生效,另外可在FilterRegistrationBean中配置路径和优先级。

对于拦截器,必须在InterceptorRegistry中调用addInterceptor方法。(路径可链式添加)

【关于流】

只能读一遍,类似管子。

只承担传输职责,而与处理和存储无关。

对于byte流而言,进行重复读取易于实现,但指针不重置,应是为了与InputStream接口定义保持一致。

原文地址:https://www.cnblogs.com/feixuefubing/p/9381731.html

时间: 2024-10-05 05:50:58

Springboot读取Request参数的坑的相关文章

ASP.NET Core 中读取 Request.Body 的正确姿势

ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能读取一次,要想多次读取,需要借助 MemoryStream ,详见博问 asp.net core中2次读取Request.Body的问题 using (var buffer = new MemoryStream()) { Request.Body.CopyTo(buffer); buffer.Pos

基于Java Bean Validation对Request参数进行校验的设计思路

摘自Hibernate Validator文档: 数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久层. 通常,相同的校验逻辑会分散在各个层中, 这样,不仅浪费了时间还会导致重复代码的发生. 为了避免重复, 开发人员经常会把这些校验逻辑直接写在领域模型里面, 但是这样又把领域模型代码和校验代码混杂在了一起, 而这些校验逻辑更应该是描述领域模型的元数据. JSR 303 - Bean Validation (version 1.1)- 为实体验证定义了元数据模型和API. 默认的元数据

SpringBoot读取application.properties文件

SpringBoot读取application.properties文件,通常有3种方式 1. @Value  例如: @Value("${spring.profiles.active}") private String profileActive;------相当于把properties文件中的spring.profiles.active注入到变量profileActive中 2. @ConfigurationProperties  例如: @Component@Configurat

软键盘实例 request参数修改

软键盘实例 request参数修改 这里的键盘 里面的内容是乱序的,每次请求都会不一样的顺序. 键盘内容是一个DIV的背景图,方框是DIV边框.控制按钮直接在前台控制就行. 请求流程如下 JSP请求软键盘图片->action 绘制图片并记录 每个值对应的位置 JSP登录(密码位置)-->Filter把密码转换成真实密码值->登录校验Filter 代码如下 <%@ page isELIgnored="false" %> <%@ page languag

读取配置文件参数和文件路径

1.读取配置文件参数 <appSettings>    <add key="Log4net" value="1"/> </appSettings> string filePath = System.Configuration.ConfigurationManager.AppSettings["log4netPath"].ToString(); System.IO.FileInfo file = new Syst

springboot 启动接收参数

springboot 启动可以通过 java -jar xxx.jar 参数 来传递启动参数到程序中.通过args[] 来传递参数非常不优雅,不同系统会有奇异,windows系统会在参数里面自己写入一行标识,Linux系统就不会,传几个参数就会按照数组位数排列. 下面介绍一种优雅的方式,就是借助于application.properties里面的属性,通过@Value将属性注入进来. 代码如下:br/>@Componentpublic class ScriptPath { @Value("

java读取request中的xml

java读取request中的xml 答: // 读取xml InputStream inputStream; StringBuffer sb = new StringBuffer(); inputStream = request.getInputStream(); String s; BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); while ((s = in.r

springboot 获取控制器参数的几种方式

这里介绍springboot 获取控制器参数有四种方式 1.无注解下获取参数 2.使用@RequestParam获取参数 3.传递数组 4.通过URL传递参数 无注解下获取参数无注解下获取参数,需要控制器层参数与HTTP请求栏参数名称一致,这样后台就可以获取到请求栏的参数. /** * 无注解获取参数时,参数名称和HTTP请求参数必须一致 * @param name String 姓名 * @param age int 年龄 * @param score double 分数 * @return

springboot yml文件 参数中的逗号 &#39;,&#39;

今天在学习springcloud的geteway的时候,使用yml配置route spring: profiles: betweenroute cloud: gateway: routes: - id: between uri: http://localhost:8763 predicates: Between=2019-06-28T15:16:04.662+08:00[Asia/Shanghai],2019-07-28T15:16:04.662+08:00[Asia/Shanghai] //错