我有以下网址
http://context_path/info/abc/def
转换为
http://context_path/info/abc%2Fdef
我的控制器映射在哪里:
@RequestMapping(value = "/info/{id}", method = RequestMethod.GET)
此处'id'包含正斜杠(/)。因此,当我点击网址时,我会收到 400 Bad Request 。
我知道可能的解决方案
@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)
答案 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)