簡體   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