繁体   English   中英

使用 Spring @RequestParam 无法在 Controller 中获取“#”符号

[英]Cannot get '#' symbol in Controller using Spring @RequestParam

我有以下请求 Url /search? 字符集=UTF-8&q=C%23C%2B%2B。 我的 controller 看起来像

@RequestMapping(method = RequestMethod.GET, params = "q")
public String refineSearch(@RequestParam("q") final String searchQuery,....

在这里我有 searchQuery = 'CC++'。 “#”编码为“%23”,“+”编码为“%2B”。 为什么 searchQuery 不包含“#”?

调试中的搜索查询

主要原因被称为“片段标识符”。 您可以在此处找到有关片段标识符的更多详细信息。 它说:

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

当你写 # 号时,它包含客户端的信息。 把浏览器需要的所有东西都放在这里。 对于所有类型的 URI 字符,您都可以遇到此问题,您可以为此查看百分比编码 在我看来,简单的解决方案是字符替换,您可以尝试在 serverbase 中替换。

最后我发现了一个问题。在过滤器链中,ServletRequest 用 DefaultXSSValueTranslator 包裹在 XSSRequestWrapper 中,这里是方法 String stripXSS(String value) 迭代模式列表,如果值与模式匹配,方法将删除它。 模式列表包含 "\#" 模式,'#' 将被替换为 ""

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

我通过对 hash 部分进行编码的 URL 解决了类似的问题。 我们有 Spring web 服务器以及 JS 和 VueJS 客户端的混合。 这解决了我的问题:

 const location = window.location; const redirect = location.pathname + encodeURIComponent(location.hash);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM