1. 描述
有些符号在 URL 中是不能直接傳遞的,如'+','%','&'等符号,那麽如果要在 URL 中傳遞這些符号要如何實現呢?
2. 解決方案
2.1 在浏覽器中直接輸入
1)解決方案
通過将這些特殊符号轉換成 16 進制。
2)常用特殊符号及其程式碼
+:URL 中+号表示空格其程式碼是 %2B
空格:URL 中的空格可以用+号或者程式碼 %20
/:分隔目錄和子目錄其程式碼是 %2F
?:分隔實際的 URL 和參數其程式碼是 %3F
%:指定特殊字符其程式碼是 %25
#:表示書簽其程式碼是 %23
&:URL 中的&表示指定的參數間的分隔符其程式碼是 %26
=:URL 中的=表示指定參數的值其程式碼是 %3D
注:在 URL 中,“+”的程式碼爲%2B,除了跟“%”的程式碼 %25 拼接到一起的時候能正常顯示外,其他拼接都默認顯示爲空格,要想正常顯示,需将“+”的程式碼改爲 %252B 才可以。
3)示例
如要字符串“this%is#te=st&o k?+/”作爲參數t的值傳遞給 test.cpt,則 URL 爲:test.cpt&t=this%25is%23te%3Dst%26o%20k%3F%2B%2F或者test.cpt&t=this%25is%23te%3Dst%26o+k%3F%2B%2F(空格可以用 %20 或 + 代替)
例如在 test.cpt 某個單元格中填入=$t,分頁預覽,在 URL 後增加上面的 URL,效果如下:
2.2 集成到項目中
1)解決方案
您可以通過 JavaScript 中自帶的 encodeURIComponent() 方法對參數值進行程式碼轉換。
2)示例
同樣實現的是字符串“this%is#te=st&o k?+/”作爲參數t的值傳遞給 test.cpt,則對應的代碼如下:
注:用戶若想查看完整代碼,可複制代碼到本地查看。
window.location="http://localhost:8075/webroot/decision/view/report?viewlet=test.cpt&t="+encodeURIComponent(encodeURIComponent("this%is#te=st&o k?+/"));
3)兩次解碼的解釋
第一次 encode 是去掉特殊字符, 變成 ASCII 字符串(STR_ENC1), 第二次 encode 是因爲 Web 容器得到後會去自動解一次,
容器 req.getParameter 自動解的這一次,不管是按 GBK 還是 UTF-8 還是 ISO-8859-1 都好,都能夠正确的得到[STR_ENC1],
如果 JS 只 encode 一次, 那麽容器那邊只能按照 UTF-8 解(客戶的 Tomcat 可能有多種程式碼方式), 否則亂碼, 最後 Java 端再去 URLDecoder.decode
注:GET 的方式, 容器 req.getParameter 的時候會自動解碼一次, 然後報表再解碼一次. 而 POST 的方式, 容器不會自動解碼的, 意味着傳的時候, 只需要 encode 一次即可.