Spring MVC Rest,使用URL调用,转义字符&导致获取控制器中的值的问题

时间:2012-06-06 13:24:23

标签: rest spring-mvc

我有一个控制器映射如下

 @RequestMapping(value = { "/search"}, method = RequestMethod.GET)
 public @ResponseBody
 Object searchProducts(@PathVariable("query") String query,
 @RequestParam(value = "param1", required = false) String param1,
 @RequestParam(value = "param2", required = false) String param2,)

当我使用下面给出的url它工作正常我甚至得到spring填充的值

 http://host/app_name/search?param1=[value]&param2=[value]

但是当使用转义字符时它会中断

 http://host/app_name/search?param1=[value]&param2=[value]

springcontext或web.xml中是否有任何配置可以让我自动处理编码? 我已经尝试在web.xml中设置下面的参数,但它不起作用

 <context-param> 
 <param-name>defaultHtmlEscape</param-name> 
 <param-value>true</param-value> 
 </context-param>  

3 个答案:

答案 0 :(得分:3)

&amp;是一个HTML转义序列,没有要求将其视为URL中的&。因此,最好修复内部系统,以使其生成正确的URL。

但是,如果由于某种原因无法执行此操作,则可以通过以下(hackish)方式解决此问题:

  • 创建Filter,将原始HttpServlerRequest包装到HttpServlerRequestWrapper的子类中。
  • 在该子类中创建“固定”参数的映射(即从原始请求获取参数并通过从参数名称的开头剥离amp;来创建新的参数映射)并覆盖getParameter*()方法使用那张地图。

答案 1 :(得分:2)

有意义的是,Spring会将其视为值的一部分,'&amp;'是HTML编码,而不是URL编码。

我会试着弄清楚系统为什么将'&'编码为'&amp;'而不是构建正确的GET字符串。

如果您想在GET参数的值中实际包含&符号,请使用%26解码为'&amp;'通过URL传递时。

答案 2 :(得分:0)

尝试:

HtmlUtils.htmlUnescape(query);