使用Spring @RequestParam无法在Controller中获得'#'符号

时间:2019-11-12 11:03:46

标签: java spring url encoding character-encoding

我有以下请求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不包含“#”?

searchQuery in debug

2 个答案:

答案 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;
    }