? ? ? ?当URL参数中含有URL字符串的时候,而该字符串还包含有中文,这个时候处理起来会比较恶心,通过yi一段时间摸索,发现可以用base64来解决这个问题:
背景:由于需要请求目标应用不支持JSONP,需要使用另外一个应用做一个中转。客户端是UTF-8编码,作为中转的应用是GBK编码,需要请求的目标应用又是需要UTF-8编码;
?
常规的思路是:
前台传输来的相应编码的URL,后台就用该编码的解码,URLDecoder.decode(params,"encodeType");
但是一般的MVC框架或者应用服务器,在绑定参数的过程中都解码了一次,前台如果想要让后端按照指定编码格式手动解码,需要encodeURIComponent两遍,第一遍框架或应用服务器解码,第二遍自己手动解码
但是这里出现的问题不常规,使用常规方式又比较麻烦,所以采取比较猥琐的方式
例如:如果想要发送这样一个请求
http://localhost/mobile/getInfo.json?url=http://localhost2/mobile/getSomething.json?params=测试
前台Javascript:
var urlEncoded = Base64.encode(encodeURI(url)); //用base64来编码,encodeURI也将中文字符和其他一些字符给一并处理了 //Then, ...使用Ajax发送请求
? ??这里用到了一个Base64 Javascript库,地址:https://github.com/dankogai/js-base64
? ?
Java端的话,使用base64解码之后就得到了encodeURI之后的URI了,直接使用HTTPClient来发送请求
?
import org.apache.commons.codec.binary.Base64; //推荐使用commons-codec包,不要使用sun.misc.base64decoder String urlRaw = request.getParameter("url"); String url = new String(Base64.decodeBase64(urlRaw.getBytes())); //Then, 就可以使用HTTPClient来请求数据 //....