如何使用 Spring Boot 抑制 url 编码

Posted

技术标签:

【中文标题】如何使用 Spring Boot 抑制 url 编码【英文标题】:How to suppress url encoding with spring boot 【发布时间】:2017-03-13 22:17:51 【问题描述】:

我使用 Spring boot 创建了一个 GET/POST API,它有一个 http url 参数,比如 refid。现在这个参数在调用 GET/POST 请求之前已经被编码了 例如http://localhost:8080/users/TESTFNkJXiQAH%2FJBKxigBx

但是,当我通过 Spring Boot 部署它时,编码的 refid 会再次编码并且 refid 会发生变化。即它变成:

http://localhost:8080/users/TESTFNkJXiQAH%252FJBKxigBx

我想通过 Spring Boot 抑制这种第二编码。有人可以在这里建议吗?

【问题讨论】:

这个网址是怎么产生的? refid 是少数参数的加密形式,然后对其进行编码,然后我们将其附加到 URL 并使用它调用 GET 或 POST。 为什么不在这个参数上使用 URL.decode?​​span> 所以我在调用 find 之前对其进行了解码:refId = URLDecoder.decode(RefId, "UTF-8"); List<TestObject> objList = TestObjectDao.findByrefId( refId); 网址仍然是双重编码的,即与之前的情况相同。 我将发布我的代码作为答案,因为 cmets 无法正确格式化代码。 【参考方案1】:

不知道你是否仍然有这个问题,或者你发现它为什么会发生,但是因为我试图向某人解释这个现象,所以我看看是否已经有一个很好的解释。不过既然你也问了,我也没有找到,所以这里是我的回答。

所以你编码你的 refid

TESTFNkJXiQAH%2FJBKxigBx

在通过 url 发送之前,然后将其提供给浏览器。现在这只是编码的 refid。当您通过 URL 直接调用它时,您必须根据 html URL 编码标准再次对其进行编码。这就是双重逃逸的原因。另请阅读this。例如。所以如果你的 refid 看起来像这样

测试%123

然后你编码它你把它变成

测试%25123

现在,如果您还想通过浏览器上的 url 传递它,则必须再次对其进行编码。

测试%2525123

但是,如果服务 A 正在使用此服务并且服务 A 正确编码此 refid,那么您将不会遇到此问题。发生这种情况只是因为您试图通过浏览器调用此 api 端点。

当然,我认为你这样做是理所当然的:

String decoded = URLDecoder.decode(refid, "UTF-8");

在你的控制器中

【讨论】:

@SimonLogic 那么最好将参数作为 POST 请求传递,然后根本不需要编码 路径参数对于 REST 方法至关重要。我在这里发现了一些问题,但没有正确的答案。我想我需要使用 AOP 手动解码由 @PathVariable 注释的 String 类型的参数。【参考方案2】:

首先传递解码后的 URL,而不是做一些不方便的事情来停止双重编码。 您在休息控制器中获得了已经解码的字段。 例如,如果您通过 www.xyz.com?name=nilesh%20salpe

您将获得参数名称的值为“nilesh salpe”而不是“nilesh%20salpe”

【讨论】:

如果解码后的 url 在编码参数中有斜杠 / 则不起作用【参考方案3】:

这是一个 URLDecoder 的基本示例:

   @RequestMapping(value = "/users/refId", method = GET)
   public void yourMethod(@PathVariable("refId") String refId) 
      // This is what you get in Spring Boot
      String encoded = refId; //"TESTFNkJXiQAH%252FJBKxigBx"

      String decoded = URLDecoder.decode(encoded, "UTF-8");

      System.out.println(decoded);

      // Result TESTFNkJXiQAH%2FJBKxigBx
   

【讨论】:

我不知道我的回答超出了。请检查上面的评论。 我看到的另一个问题是我在应用程序调试中找不到编码的 refid,但是 URL 将 % 显示为 %25。我试图解码的代码在我传递的原始 refid 上。 如何从 URL 中获取 refid?

以上是关于如何使用 Spring Boot 抑制 url 编码的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 REST 控制器使用 Spring (Boot) 重写 URL?

如何使用 Spring Boot 配置嵌入式 ActiveMQ 代理 URL

spring boot怎么配置编程式事务TransactionTemplate?

使用spring boot时如何通过在浏览器中点击URL来加载角度组件?

如何基于 URL 模式应用 Spring Boot 过滤器?

如何确定向远程 Spring Boot 服务器发送请求的 URL?