|
在Spring中對(duì)于Ajax請(qǐng)求 在控制器中可以標(biāo)注@ResponseBody注解,來(lái)讓Spring不進(jìn)行視圖渲染 而直接返回字符串。但是IE中總是提示下載。 最近做一個(gè)項(xiàng)目,之前一直都是用火狐調(diào)試,昨天心血來(lái)潮用IE測(cè)了一下,發(fā)現(xiàn)了這個(gè)問(wèn)題! 然后果斷谷歌度娘之,主要有兩種解決辦法: 1. 直接使用response來(lái)寫,這個(gè)就不多解釋了,詳見(jiàn)http://www.cnblogs.com/danghuijian/archive/2012/06/21/2557415.html 2. 使用ResponseEntity<String>,詳見(jiàn)http://blog.csdn.net/songyongfeng/article/details/8663886,這個(gè)沒(méi)有試過(guò),不過(guò)應(yīng)該是可以解決問(wèn)題的。 這2個(gè)方法都是去掉@ResponseBody注解。 雖然可以解決,但是個(gè)人喜歡@ResponseBody注解的優(yōu)雅(不喜者勿噴),所以依然沒(méi)有放棄。
出現(xiàn)這個(gè)問(wèn)題原因就是Ajax返回的response的hearder 是 Content-Type=application/json。這個(gè)是新標(biāo)準(zhǔn),IE不識(shí)別。 那第一反應(yīng)的解決辦法就是在攔截器里,用response.setHeader();直接修改不就O了 但是經(jīng)測(cè)試無(wú)效,詳細(xì)原因見(jiàn) http://blog.csdn.net/tanguang_honesty/article/details/12782523
然后改變了下思路,跟蹤springmvc源碼,AbstractHttpMessageConverter 這個(gè)類是處理@ResponseBody注解方法的。 他里面的write是調(diào)用轉(zhuǎn)換器(我用的是阿里巴巴的FastJson FastJsonHttpMessageConverter)轉(zhuǎn)成json之后寫到前臺(tái), 發(fā)現(xiàn)這里response的header已經(jīng)是application/json了,難道是springmvc默認(rèn)的是這個(gè),那不就無(wú)解了。 還不死心,有一層一層的往上找,終于,在不小心看了一下FastJson FastJsonHttpMessageConverter的源碼之后豁然開(kāi)朗
原來(lái)application/json是從這里來(lái)的,這下就好辦了 修改下配置文件
測(cè)試,OK,問(wèn)題解決。 很久沒(méi)有這樣花2天時(shí)間來(lái)解決一個(gè)問(wèn)題,個(gè)人覺(jué)得是比較優(yōu)雅的解決方案。特此記錄一下。 對(duì)于用默認(rèn)的json轉(zhuǎn)換器jackson的解決方法應(yīng)該是類似的,因?yàn)闆](méi)有用就沒(méi)有詳細(xì)研究
原創(chuàng) 轉(zhuǎn)載需注明 |
|
|