返回顶部
首页 > 资讯 > 精选 >如何使用Spring处理x-www-form-urlencoded方式
  • 782
分享到

如何使用Spring处理x-www-form-urlencoded方式

2023-06-25 12:06:47 782人浏览 安东尼
摘要

这篇文章给大家分享的是有关如何使用spring处理x-www-fORM-urlencoded方式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring处理x-www-form-urlencoded方式最近在重

这篇文章给大家分享的是有关如何使用spring处理x-www-fORM-urlencoded方式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Spring处理x-www-form-urlencoded方式

最近在重写一个项目时遇到了许多奇葩问题,这个项目是一个简单的WEB后台项目,基本上全都是增删改查数据库的操作。这里面遇到几个用spring接收前端post请求的接口。

基本情况是post请求有四种data参数格式,这些基础知识在我另一片博文中提到过这里就不废话了。主要是因为前端有两个地方用到了这个接口,但是在用这个接口的时候两个地方用法都不同,奇葩的c++居然还都解析成功了(其实因为c++没有对请求参数格式和数据做检查所以一直没有问题)。

一个地方是发送的是application/JSON格式,发送了一个jsonArray数据(数据例子["abc", "bcd"])这个是没有问题的正确使用方式。(下面简称前者)

另一个地方是发送的application/x-www-form-urlencode格式,发送的也是一个jsonArray数据。(下面简称后者)

前者解析方式比较简单

 @RequestMapping(value = "/check_apps_version",      method = RequestMethod.POST,      produces = {"application/json;charset=UTF-8"},      consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)  @ResponseBody  public BaseResponse<List<AppListItem>> checkAppsVersion(ReqCheckAppsVersion requstParam,      @RequestBody List<String> apps) {    return new BaseResponse<>();  }

后者这个发送方式在spring用@RequestBody解析时就很怪异,但是前段是手机APP已经发布出去了没法修改,只能后端来修改满足这个奇怪的需求

通过调试发现后者前端的接口传过来的参数是"["abc","def"]="这样子的,本身x-www-form-urlencode是多个kev-value对的数据格式,所以现在没有value只有key了,只能通过字符串处理来解决了。

  @RequestMapping(value = "/check_apps_version",      method = RequestMethod.POST,      produces = {"application/json;charset=UTF-8"},      consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)  @ResponseBody  public BaseResponse<List<AppListItem>> checkAppsVersionParams(httpservletRequest request,                                                                ReqCheckAppsVersion requstParam,                                                                @RequestBody String apps) { String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));    return BaseResponse.success();  }

两种方式,一种是通过@RequestBody把post data解析成string格式,另一种是通过HttpServletRequest解析出整个原始post data。然后做字符串处理。

但是在做做这个测试时候我们想了一下会不会有只有value没有key的情况,也就是这样"=["abc","def"]"。

测试结果是用Tomcat没法从HttpServletRequest到这个post data,但是用jetty可以从HttpServletRequest解析到post data。

这个可能是tomcat和jetty的区别吧,还没有弄清楚什么原因。但是我们的问题总算是解决了,最大感触就是前人挖坑后人埋啊。

希望以后能注意一下代码健壮性的问题,避免给别人或者自己挖坑。

关于application/x-www-form-urlencoded编码

同事遇到在servlet端通过request对象getInputStream读取POST过来的数据,却读不到的问题,怀疑是tomcat的问题。查了一下Content-type是application/x-www-form-urlencoded,估计是被解析成了parameters,果然在他获取流之前,有过request.getParameter的操作。

熟悉servlet的话,这个问题应该算常识了。它其实跟容器无关,所有的servlet容器都是这样的行为。几年前在实现一个网关代理的时候就遇到过这个问题,当时使用的是jetty,发现POST过来的数据读不到,也是application/x-www-form-urlencoded编码,断点跟踪发现是在获取流之前有过request.getParameter,数据会被解析,并且后续数据流不可再被读取。

在servlet规范3.1.1节里,对POST数据何时会被当做parameters有描述:

The request is an HTTP or HTTPS request.
2. The HTTP method is POST.
3. The content type is application/x-www-form-urlencoded.
4. The servlet has made an initial call of any of the getParameter family of methods on the request object.

If the conditions are met, post form data will no longer be available for reading directly from the request object's input stream.

规范里已经明确的声明当请求满足:

1) http/https

2) POST

3) Content-type 是application/x-www-form-urlencoded

4) 调用过getParameter方法,则数据会被当做请求的paramaters,而不能再通过 request 的 inputstream 直接读取。

所以不论tomcat、jetty还是其他servlet容器都遵循这个方式。不过话说回来,为什么application/x-www-form-urlencoded编码的数据会被当做parameter来解析呢?

使用http上传数据可以用GET或POST,使用GET的话,只能通过uri的queryString形式,这会遇到长度的问题,各个浏览器或server可能对长度支持的不同,所以到要提交的数据如果太长并不适合使用GET提交。

采用POST的话,既可以在uri中带有queryString也可以将数据放在body中。body内容可以有多种编码形式,其中application/x-www-form-urlencoded编码其实是基于uri的percent-encoding编码的,所以采用application/x-www-form-urlencoded的POST数据和queryString只是形式不同,本质都是传递参数。

在tomcat的Request.parseParameters方法里,对于application/x-www-form-urlencoded是有做判断的,对这种编码会去解析body里的数据,填充到parameters里,所以后续想再通过流的方式读取body是读不到的(除非你没有触发过getParameter相关的方法)。

html4之前,表单数据的编码方式只有application/x-www-form-urlencoded这一种(现在默认也是这种方式),因为早期的时候,web上提交过来的数据也是非常简单的,基本上以key-value形式为主,所以表单采用application/x-www-form-urlencoded这种编码形式也没什么问题。

感谢各位的阅读!关于“如何使用Spring处理x-www-form-urlencoded方式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 如何使用Spring处理x-www-form-urlencoded方式

本文链接: https://lsjlt.com/news/304625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用Spring处理x-www-form-urlencoded方式
    目录Spring处理x-www-form-urlencoded方式关于application/x-www-form-urlencoded编码Spring处理x-www-form-ur...
    99+
    2024-04-02
  • 如何使用Spring处理x-www-form-urlencoded方式
    这篇文章给大家分享的是有关如何使用Spring处理x-www-form-urlencoded方式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring处理x-www-form-urlencoded方式最近在重...
    99+
    2023-06-25
  • Java 如何实现POST(x-www-form-urlencoded)请求
    目录JavaPOST(x-www-form-urlencoded)请求1、引入maven包2、代码实现3、POSTMAN参数组装使用post请求x-www-form-urlencod...
    99+
    2024-04-02
  • springboot如何接收application/x-www-form-urlencoded类型的请求
    目录请求数据Controller几种处理方式SpringMVC application/x-www-form-urlencoded接收方式测试1.参数前不加注解2.参数前添加@Req...
    99+
    2024-04-02
  • Spring AOP 后置处理器使用方式
    目录1 前言2 BeanPostProcesser 后置处理器3 总结1 前言 在 Spring 的体系中,在前文中已经讲述了 IOC 容器以及 Bean 的理解,在本文基于之前文章...
    99+
    2024-04-02
  • Spring使用注解方式处理事务
    Spring有专门的类来处理事务,在这之前我们先要理解Spring处理事务中的几个概念: 1.接口: 事务管理器是PlatformTransactionManager接口,在接口中定...
    99+
    2024-04-02
  • 如何使用spring ResponseEntity处理http响应
    简介 使用spring时,达到同一目的通常有很多方法,对处理http响应也是一样。本文我们学习如何通过ResponseEntity设置http相应内容、状态以及头信息。 Respon...
    99+
    2024-04-02
  • 如何使用Spring Batch批处理框架
    这篇文章主要讲解了“如何使用Spring Batch批处理框架”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Spring Batch批处理框架”吧!1 前言Spring Batch是...
    99+
    2023-06-16
  • Spring中Bean后置处理器如何使用
    这篇文章主要讲解了“Spring中Bean后置处理器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中Bean后置处理器如何使用”吧!一、BeanPostProcessor...
    99+
    2023-07-02
  • 使用spring框架实现数据库事务处理方式
    目录使用spring框架实现数据库事务处理JDBC对数据库事务处理的支持JDBC定义了五种事务隔离级别来解决这些并发导致的问题在spring框架中调用一个数据库事务处理分三步走:sp...
    99+
    2024-04-02
  • 如何使用Spring AOP预处理Controller的参数
    Spring AOP预处理Controller的参数 实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用 比如有这样一个Controller @Con...
    99+
    2024-04-02
  • 如何使用Spring更好地处理Struts 动作
    这篇文章主要介绍了如何使用Spring更好地处理Struts 动作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Struts Recipes 的合著者 George Fran...
    99+
    2023-06-03
  • 使用spring aop统一处理异常和打印日志方式
    我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger.warn(),logger.error()的代码,这样一个方法本来的业务逻辑只有5行,有了这些,代码...
    99+
    2024-04-02
  • React Hook Form优雅处理表单使用的方法是什么
    这篇“React Hook Form优雅处理表单使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-07-05
  • 如何在Spring中使用声明式事务管理
    本篇文章为大家展示了如何在Spring中使用声明式事务管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基于TransactionProxyFactoryBean的事务管理配置Spring中配置AO...
    99+
    2023-05-31
    spring 声明式事务管理
  • python如何使用form-data形式上传文件请求
    本篇内容介绍了“python如何使用form-data形式上传文件请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!虽然现在基本上都约定俗成...
    99+
    2023-07-06
  • 如何使用纯java config来配置spring mvc方式
    这篇文章将为大家详细讲解有关如何使用纯java config来配置spring mvc方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用xml配置spring是大部分...
    99+
    2023-06-21
  • Spring中如何使用设计模式
    关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。1. 策略模式关于策略模式的使用方式,在Spring中其实比较简单,从本质上讲,策略模式就...
    99+
    2023-06-05
  • 使用spring boot如何对异常请求进行处理
    这期内容当中小编将会给大家带来有关使用spring boot如何对异常请求进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。404异常处理:@Controllerpublic class&n...
    99+
    2023-05-31
    springboot 进行处理
  • 如何使用Ajax方法实现Form表单的提交
    这篇文章主要介绍了如何使用Ajax方法实现Form表单的提交,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常见的form表单提交方式<...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作