我有以下请求Url / search?字符集 = UTF-8&q = C%23C%2B%2B。 我的控制器看起来像
@RequestMapping(method = RequestMethod.GET, params = "q")
public String refineSearch(@RequestParam("q") final String searchQuery,....
在这里,我有searchQuery ='CC ++'。 '#'编码为'%23','+'为'%2B'。 为什么searchQuery不包含“#”?
答案 0 :(得分:0)
主要原因被称为“片段标识符”。您可以在here右边找到Fragment Identifier的更多详细信息。它说:
由井号#引入的片段标识符是文档URL的可选最后一部分。通常用于标识该文档的一部分。
当您编写#号时,它包含有关clientbase的信息。将仅浏览器所需的所有内容放在此处。对于所有类型的URI字符,您都可能会遇到此问题,您可以为此Percent Encoding。在我看来,简单的解决方案是字符替换,您可以尝试在serverbase中进行替换。
答案 1 :(得分:0)
最后我发现了一个问题。在过滤器链中,ServletRequest用DefaultXSSValueTranslator包装在XSSRequestWrapper中,这是方法String stripXSS(String value)遍历模式列表,如果值与模式匹配,该方法将删除它。 模式列表包含“ \ u0023”模式,“#”将替换为“”
DefaultXSSValueTranslator.
private String stripXSS(String value) {
Pattern scriptPattern;
if (value != null && value.length() > 0) {
for(Iterator var3 = this.patterns.iterator(); var3.hasNext(); value = scriptPattern.matcher(value).replaceAll("")) {
scriptPattern = (Pattern)var3.next();
}
}
return value;
}