@ResponseBody 返回json数据 在IE浏览器提示保存文件,但是在firefox中却可以正常的实现功能。
2014-08-22 15:42
671 查看
@ResponseBody分析
在SpringMVC中可以在Controller的某个方法上加@ResponseBody注解,表示该方法的返回结果直接写入HTTP response body中。但是实际使用中发现最后生成的response中"Content-Type"的值不正确。
Spring使用AnnotationMethodHandlerAdapter来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。
AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type"。
一般的请求都是通过浏览器进行的,request header中"Accept"的值由浏览器生成。
Chrome生成的值为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE8生成的值为application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, */*
所以最后写入response中"Content-Type"的值为"application/xml"或"application/x-ms-application"。
但我们一般会在标注@ResponseBody的方法上返回String或byte[]类型的结果,期望的"Content-Type"的值应为"text/plain"或"application/octet-stream"。
这样导致了浏览器不能正确处理返回的内容。
实际上Spring在用HttpMessageConverter处理的过程中首先会判断response header中有没有写入"Content-Type",如果没有写入的话才会使用request header中"Accept"的第一个值。
但是由于Spring对HttpServletResponse进行了封装,实际上使用的是ServletServerHttpResponse,这个类有一个对真正的HttpServletResponse的引用。
判断response header的过程中使用的是ServletServerHttpResponse的getHeaders()方法,但该方法并没有返回真正的HttpServletResponse中的header。(这应该有问题吧?)
所以我们虽然可以在Controller的方法中加入对HttpServletResponse的引用,然后设置"Content-Type"的值,但是并不会起作用。
这就导致了,@ResponseBody 返回json数据 在IE浏览器提示保存文件,但是在firefox中却可以正常的实现功能。
转:http://xiangfeipy.blog.163.com/blog/static/83572185201341544013552/
相关文章推荐
- FireFox中使用JQuery的ajaxfileupload插件返回JSON格式数据提示保存的解决方法。
- spring mvc @responsebody返回json数据 ie浏览器弹出下载页面 解决方案
- 解决IE下返回json数据提示文件保存到问题
- 解决IE浏览器下上传文件返回Json数据提示下载的问题。
- 解决IE下返回json数据提示文件保存到问题
- servlet返回application/json数据类型在ie浏览器中提示下载文件问题
- SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)
- 如何解决“文件上传返回JSON数据,在IE下提示下载文件”的问题?
- Spring MVC使用@ResponseBody返回JSON数据406以及乱码问题解决方案
- springmvc @ResponseBody 返回json数据错误
- 上传文件返回的json数据会被提示下载问题解决方案
- Jquery 返回json数据在IE浏览器中提示下载的问题
- spring MVC 3.1 注解:@ResponseBody 返回json数据
- 实习第一天——做一个录音上传服务器的小功能pttp协议post发送文件和参数到服务器,解析返回的json数据
- Jquery 返回json数据在IE浏览器中提示下载的问题
- springmvc @ResponseBody 返回json数据错误
- IE9.0或者360下js(JavaScript、jQuery)不能正确执行(加载),按F12后执行正常;Firefox下ajax的success返回数据data(json、string)无法获取
- springmvc @ResponseBody 返回json数据错误
- spring MVC 3.1 注解:@ResponseBody 返回json数据
- 解决在IE浏览器中点击登录出现打开或保存json文件的提示