Java 无法获取'#';使用Spring@RequestParam的控制器中的符号

Java 无法获取'#';使用Spring@RequestParam的控制器中的符号,java,spring,url,encoding,character-encoding,Java,Spring,Url,Encoding,Character Encoding,我有以下请求Url/搜索?charset=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不

我有以下请求Url/搜索?charset=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不包含“#”


主要原因称为“片段标识符”。您可以找到片段标识符右侧的更多详细信息。它说:

散列标记#引入的片段标识符是文档URL的可选最后一部分。它通常用于标识该文档的一部分


当您编写#符号时,它包含clientbase的信息。将浏览器需要的所有内容都放在此处。对于所有类型的URI字符,您都会遇到此问题。您可以查找此问题。在我看来,简单的解决方案是字符替换,您可以尝试在serverbase中进行替换。

最后我发现了一个问题。在筛选器链中,ServletRequest使用DefaultXSSValueTranslator包装在XSSRequestWrapper中,下面是String stripXSS(String value)方法,它通过模式列表进行迭代,以防值与模式匹配,方法将删除它。 模式列表包含“\u0023”模式,并且“#”将替换为“”


因为HTML中使用了
#
来制作尖锐的锚定,所以它在URL中有一个用例,为了避免错误匹配,必须在剩余的时间内对其进行转义。感谢您的回答。但是有什么解决方案可以在controller中获取“#”吗?无法重现。我得到了“C++”。如何显示searchQuery的值?刚刚在调试模式下检查,这里searchQuery的值是'CC++@AlexFilatov我在问题中附上了一个屏幕截图atopHe是否使用URL编码:C%23C%2B%2B
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;
    }