处理REST API中的特殊字符

时间:2016-11-30 05:39:42

标签: java spring rest tomcat bad-request

我有以下网址

http://context_path/info/abc/def

转换为

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

我的控制器映射在哪里:

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

此处'id'包含正斜杠(/)。因此,当我点击网址时,我会收到 400 Bad Request

我知道可能的解决方案

  • 设置tomcat以允许正斜杠。
  • 使用网址编码。
  • 使用@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)

3 个答案:

答案 0 :(得分: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 save implementation

答案 1 :(得分:0)

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

但它有它的局限性,我建议你在调用api的同时用'#'替换正斜杠,然后再将其替换为正斜杠,然后再在rest控制器中处理它。

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

答案 2 :(得分:-1)