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