处理的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) 
+0

的可能的复制[匹配“其余的URL”使用Sp ring 3 RequestMapping Annotation](http://*.com/questions/4542489/match-the-rest-of-the-url-using-spring-3-requestmapping-annotation) – user1211

+0

但是为什么有一个斜杠在你的ID值? – ScanQR

+0

@TechBreak我知道它错了。但我正在研究旧的价值观,我无法修改这些。 – SuhasD

这不是很好,但你可以使用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编码的实施

+0

这是行不通的。 Spring将解码或取消映射url,然后尝试根据生成的URL调用处理程序方法。因此它将作为不良请求返回。 – ScanQR

+0

@TechBreak你试过了吗?我现在正在尝试,它的工作原理。 – dit

+0

@dit Base64运行良好,但只要它包含'?'就发出它。然后它将它转换成'/'。任何其他编码器谁不使用'/'进行编码? – SuhasD

+0

我添加以下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时进行替换是不可能的,那么您可以使用过滤器并在那里替换数据。