我有一个控制器映射如下
@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]¶m2=[value]
但是当使用转义字符时,它会中断
http://host/app_name/search?param1=[value]&param2=[value]
在 springcontext 或 web 中是否有任何配置.xml这将允许我自动处理编码?我已经尝试在 Web 中设置下面的 contect.xml但它不起作用
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
&
是一个 HTML 转义序列,不需要将其视为 URL 中的&
。因此,最好修复您的内部系统,以使其生成正确的URL。
但是,如果由于某种原因无法执行此操作,则可以通过以下方式解决此问题(hackish):
- 创建一个
Filter
,将原始HttpServlerRequest
包装到HttpServlerRequestWrapper
子类中。 - 在该子类中,创建一个"固定"参数的映射(即从原始请求中获取参数,并通过从参数名称的开头剥离
amp;
来创建新的参数映射)并覆盖getParameter*()
使用该映射的方法。
Spring 会将其视为值的一部分是有意义的,'&'
它是 HTML 编码的,而不是 URL 编码的。
我会尝试弄清楚为什么系统将'&'
编码为 '&'
而不是构建正确的 GET 字符串。
如果要在 GET 参数的值中实际包含与号,请使用 %26,它在通过 URL 传递时解码为"&"。
尝试:
HtmlUtils.htmlUnescape(query);