問題場景:文件上傳,在谷歌里可以正常操作,IE瀏覽器操作出錯(cuò),服務(wù)請求報(bào)錯(cuò)。HTTP 400 錯(cuò)誤 - 請求無效 (Bad request)


問題分析:對比兩個(gè)請求可以發(fā)現(xiàn),二者的請求URL不一致。jsp通過url請求傳遞參數(shù)給后端,但是url的格式不對會造成請求失敗。這種url的問題常發(fā)生在在IE瀏覽器中,其他瀏覽器火狐、chrome等不會有問題。因?yàn)楣雀柚袝詣?dòng)給空格和一些特殊字符編碼,而IE沒有這一步。
解決辦法:手動(dòng)給url編碼。在文件upload的方法里對url進(jìn)行兩次編碼
encodeURI(encodeURI(url))
以上問題涉及的知識:
1、http請求過程:
瀏覽器把URL(以及post提交的內(nèi)容)經(jīng)過編碼后發(fā)送給服務(wù)器。
?服務(wù)器將對內(nèi)容解碼,進(jìn)行處理,再把結(jié)果編碼返回給瀏覽器。
?瀏覽器按照指定的編碼顯示該網(wǎng)頁。
字符串編碼和解碼時(shí)涉及到的字符集,如ISO8859-1、GBK、UTF-8、UNICODE。
2、URL編碼
(1)URL編碼特點(diǎn):
由于 URL 常常會包含 ASCII 集合之外的字符,URL 必須轉(zhuǎn)換為有效的 ASCII 格式。
URL 編碼使用 "%" 其后跟隨兩位的十六進(jìn)制數(shù)來替換非 ASCII 字符。
URL 不能包含空格。URL 編碼通常使用 + 來替換空格。
(2)URL編碼方法
escape()不能直接用于URL編碼,它的真正作用是返回一個(gè)字符的Unicode編碼值。escape()不對"+"編碼 主要用于漢字編碼,現(xiàn)在已經(jīng)不提倡使用。
encodeURI()是Javascript中真正用來對URL編碼的函數(shù)。編碼整個(gè)url地址,但對特殊含義的符號"; / ? : @ & = + $ , #",也不進(jìn)行編碼。對應(yīng)的解碼函數(shù)是:decodeURI()。
encodeURIComponent() 能編碼"; / ? : @ & = + $ , #"這些特殊字符。對應(yīng)的解碼函數(shù)是decodeURIComponent()。假如要傳遞帶&符號的網(wǎng)址,所以用encodeURIComponent()
原博文:IE瀏覽器兼容之URL編碼