關於 解決Spring @ResponseBody註解返回字符串IE提示下載

在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的解決方法應該是類似的,因爲沒有用就沒有詳細研究


原創 轉載需註明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章