今天遇到個神奇的問題,前端上傳圖片到文件服務器上,然后將圖片地址傳到后台,后台保存路徑到數據庫中,但是展示的時候路徑一直有問題。
比如前端入參
...../953983fd-576b-44fb-ae11-57b5e78ced73?q-sign-algorithm=sha1&q-ak=AKIDmNksnTjNZeV9Y4qo37UcbS6WhdKtaI8j&q-sign-time=1582808716;1582809616&q-key-time=1582808716;
然后后台返回的卻是
...../953983fd-576b-44fb-ae11-57b5e78ced73?q-sign-algorithm=sha1&q-ak=AKIDmNksnTjNZeV9Y4qo37UcbS6WhdKtaI8j&q-sign-time=1582808716;1582809616&q-key-time=1582808716;
也就是會將&轉義成&
出現這種問題的原因就是springMVC對於特殊字符會進行轉義,例如&---->&
但是具體的源碼沒有找到在哪,后面有時間再去找一下。。。
解決方法可以有以下幾種:
1、StringEscapeUtils
java中可以使用 org.apache.commons.lang3 包中的 StringEscapeUtils.unescapeHtml4(String str) 方法來進行解碼。
不過會提示這個方法被棄用了,可以使用org.apache.commons.text.StringEscapeUtils,maven依賴如下:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.1</version> </dependency>
String unescapeHtml4 = StringEscapeUtils.unescapeHtml4(sysAd.getImgPath());
通過這個方法就能將已經被轉義的字符還原回來。
2、base64編碼
前端在傳入參數的時候,可以對參數進行base64的編碼,然后再傳入到后端,然后拿到后端返回數據的時候,進行base64的解碼。
引入js文件:
<script src="js/jquery-3.2.1.min.js" type="text/javascript"></script> <script src="js/jquery.base64.js" type="text/javascript"></script>
使用方法:
//對 123321 進行加密 var str = $.base64.encode('123321'); alert(str); //對 str 進行解密 var dstr = $.base64.decode(str); alert(dstr)
3、urlEncode與urlDecode
這個原理也是一樣的,因為我這邊的入參是圖片地址,是一個url,因此可以使用這種方式進行encode與decode
編碼
var str = encodeURIComponent('中文');
解碼
var str = decodeURIComponent(UrlEncode);