【问题标题】:Handling special characters in REST API处理 REST API 中的特殊字符
【发布时间】:2017-04-14 08:18:36
【问题描述】:

我有以下网址

http://context_path/info/abc/def

像这样被转换

http://context_path/info/abc%2Fdef

我的控制器映射在哪里:

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET)

这里 'id' 包含正斜杠 (/)。因此,当我点击 URL 时,我得到 400 Bad Request

我知道可能的解决方案

  • 将 tomcat 设置为允许正斜杠。
  • 使用 URL 编码。
  • 使用@RequestParam 代替@PathVariable

但上述解决方案对我来说是不可能的。

问。是否有任何其他解决方案,例如(使用正则表达式或更改映射或其他任何东西)来解决这个问题? 还有tomcat如何正确处理其他特殊字符 ('.' , ''' , ':' , ',') 并且控制器被击中但不是 '/' .

试过但没用:

1) @RequestMapping(value = "/info/{id:.*}", method = RequestMethod.GET)
2) @RequestMapping(value = "/info/{id}/**", method = RequestMethod.GET)
3) @RequestMapping(value = "/info/**", method = RequestMethod.GET)

【问题讨论】:

  • 但是为什么你的 id 值有个斜线呢?
  • @TechBreak 我知道它错了。但我正在处理旧值,我无法修改它们。
  • @user3632894 尝试了这两种方法,但都不起作用
  • @SuhasD 澄清一下,你有能力在客户端处理 url 然后调用服务器吗?

标签: java spring rest tomcat bad-request


【解决方案1】:

不是很好,但你可以使用Base64 transformation

因此您的客户端将发送一个编码的id,然后您将其解码回您的控制器中。

import org.apache.commons.codec.binary.Base64;

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET)
public String get(@PathVariable String id) {
    final String realId = new String(new Base64(true).encodeBase64URLSafe(id));
    [...]
}

编辑:您应该使用 Base64 的 url 保存实现

【讨论】:

  • 这行不通。 Spring 将解码或取消转义映射 url,然后尝试根据结果 URL 调用处理程序方法。因此它将作为错误请求返回。
  • @TechBreak 你试过了吗?我现在试过了,它有效。
  • @dit Base64 运行良好,但如果 id 包含“?”就发出它然后它将其转换为'/'。任何其他不使用“/”进行编码的编码器?
  • @SuhasD 使用来自 Apache 的 URL save base64 实现:stackoverflow.com/questions/5641303/base64url-in-java
  • @dit new Base64(true) 适合我。谢谢。我使用 .encodeBase64URLSafe() 方法而不是 .encode() 来删除“\r”和“\n”。 stackoverflow.com/questions/19952621/…
【解决方案2】:

你可以使用这样的东西 How to handle requests that includes forward slashes (/)?

但它有其局限性,我建议您在调用 api 时将正斜杠替换为 '#' 之类的其他内容,然后再次将其替换回正斜杠,然后再在 rest 控制器中处理它。

如果在调用 api 时无法替换,则可以使用过滤器并替换那里的数据。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 我在 Reg-EX [\[\]A-Za-z0-9 \"',():._^-]+ 之后添加。它适用于除 '/ 之外的所有其他特殊字符' 如果我在 Reg-EX 上进行修改,如 [\\/\[\]A-Za-z0-9 \"',():._^-]+ 则没有 URL 有效(即使是那些正在使用的旧的 Reg-EX)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2012-11-14
    • 2012-09-18
    相关资源
    最近更新 更多