如何使用 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来加载角度组件?