处理的REST API的特殊字符
我有以下URL处理的REST API的特殊字符
http://context_path/info/abc/def
其被转换像
http://context_path/info/abc%2Fdef
凡为我的控制器映射为:
@RequestMapping(value = "/info/{id}", method = RequestMethod.GET)
这里“身份证'包含正斜杠(/)。所以当我打到网址时,我收到400错误请求。
我知道可能的解决方案
- 设置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)
这不是很好,但你可以使用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编码的实施:
- 的javascript:js-base64
- 的java:Base64 from Apache Commons
- Is it ok to remove newline in Base64 encoding
您可以使用正则表达式来定义网址。请参阅http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates-regex
我添加以下Reg-EX [\\ [\\] A-Za-z0-9 \'',():._^- ] +。适用于除'/'以外的所有其他特殊字符,并且如果我像[\\/\\ [\\] A-Za-z0-9 \'',():._^- ] +那样修改上述Reg-EX,则没有URL正在工作(即使那些正在使用旧的Reg-EX) – SuhasD
您可以使用类似这样 How to handle requests that includes forward slashes (/)?
但是它有它的局限性,我建议你换成别的东西像“#”斜杠而调用API,然后再更换回来在休息控制器中处理之前转发斜线。
如果在调用API时进行替换是不可能的,那么您可以使用过滤器并在那里替换数据。
的可能的复制[匹配“其余的URL”使用Sp ring 3 RequestMapping Annotation](http://stackoverflow.com/questions/4542489/match-the-rest-of-the-url-using-spring-3-requestmapping-annotation) – user1211
但是为什么有一个斜杠在你的ID值? – ScanQR
@TechBreak我知道它错了。但我正在研究旧的价值观,我无法修改这些。 – SuhasD