为什么在springboot rest controller的url路径中将plus(+)解码为space()?

时间:2017-03-02 19:13:43

标签: spring spring-mvc spring-boot undertow tomcat8.5

使用像这样的请求处理程序调用GET http://localhost:8080/things/ZhaD2lk27XQPRJtwrABltd+UTWXcbnY%2FTrpxGP7VDVo=我的Spring Boot应用程序RestController时:

  @RequestMapping("/things/{thingId}")
  public ResponseEntity<Thing> getThing(
      @PathVariable String thingId) {

    System.out.println("thingId=" + thingId);
  ...

导致以下内容被打印ZhaD2lk27XQPRJtwrABltd UTWXcbnY/TrpxGP7VDVo=而不是我预期的ZhaD2lk27XQPRJtwrABltd+UTWXcbnY/TrpxGP7VDVo=

正如您所看到的,正在变成一个空间。这不应该发生在路径部分,只有查询部分。这就是为什么我用来构建URL的Spring UriComponentsBuilder.build().encode()没有将加号转换为%2B

我需要调整应用程序以使编码的斜杠(/)起作用。有关详细信息,请参阅REST Endpoint unreachable if ID in URL contains %2F

我正在使用SpringBoot 1.4.4.RELEASE,它使用Tomcat嵌入8.5.11 我试过从Spring RestTemplate,Postman和Chrome调用该服务。在所有情况下结果相同,加号变为空格

1 个答案:

答案 0 :(得分:1)

在确定我的IDE已自动将spring-boot-starter-undertow添加到POM文件后,我能够解决。我没有从spring-boot-starter-web中排除spring-boot-starter-tomcat,所以我不确定幕后发生了什么,但是删除spring-boot-starter-undertow依赖修复了这个问题。